Articles of multithreading

我如何暂停另一个线程(不是当前的线程)?

我正试图实现一个微控制器的模拟。 这种模拟并不是要做一个特定微控制器的时钟周期精确表示,而是检查代码的一般正确性。 我想有一个执行正常代码的“主线程”和执行ISR代码的第二个线程。 无论何时需要运行ISR,ISR线程都会挂起“主线程”。 当然,我想有一个function来阻止中断。 我想通过一个互斥体来解决这个问题,即只要ISR线程执行ISR代码,只要“中断被阻塞”,主线程就持有它。 一个POR(上电复位)可以通过不仅暂停而且杀死主线程(并启动一个执行PORfunction的新线程)来实现。 Windows API提供了必要的function。 但是,使用posix线程(在linux上)似乎不可能做到这一点。 我不想改变实际的硬件独立的微控制器代码。 所以插入任何东西来检查挂起的中断不是一个选项。 接收不良行为点的中断是可取的,因为这也发生在微控制器上(除非你阻止中断)。 有没有办法暂停在Linux上的另一个线程? (我想,debugging器必须以某种方式使用该选项。) 请不要告诉我这是个坏主意。 我知道在大多数情况下都是如此。 但主代码不使用标准库或锁/互斥/信号量。

性能 – multithreading或多进程应用程序

为了在Linux上开发一个高度networking密集的服务器应用程序,什么样的架构是首选? 这个想法是,这个应用程序通常运行在具有多个内核(虚拟或物理)的机器上。 考虑到性能是关键标准,最好去multithreading应用程序还是使用多进程devise的应用程序? 我知道,资源共享和同步从多个进程访问这些资源是很多编程开销,但如前所述,总体性能是关键要求,所以我们可以忽略这些东西。 编程语言是C / C ++。 我听说即使是multithreading应用程序(单进程)也可以利用多个内核,并且独立地在不同的内核上运行每个线程(只要没有同步问题)。 这个调度是由内核完成的。 如果是这样,multithreading应用程序和多进程应用程序在性能上没有太大的区别? Nginx使用多进程架构,并且非常快,但是multithreading应用程序可以获得相同的性能吗? 谢谢。

在Linux上编写multithreadingTCP服务器

在工作中,我负责将TCP服务器作为Modbus从站设备的一部分来实现。 我在堆栈交换和一般的互联网(包括优秀的http://beej.us/guide/bgnet/ )上都做了大量的阅读,但是我正在为devise问题而苦苦挣扎。 总之,我的设备只能接受2个连接,每个连接都会接收到我在主控制器环路中必须处理的modbus请求,然后回复成功或失败状态。 我有如何实现这一点的以下想法。 有一个侦听器线程创build,绑定,侦听和接受连接,然后生成一个新的pthread来监听传入数据的连接,并在空闲超时期限后closures连接。 如果当前活动线程的数量是2,则立即closures新的连接以确保只允许2个连接。 不要从侦听器线程产生新线程,而是使用select()来检测传入的连接请求,以及在活动连接上传入的modbus连接(类似于Beejs指南中的方法)。 创build两个监听器线程,每个监听器线程创build一个可以阻塞accept()调用的套接字(相同的IP和端口号),然后closures套接字fd并处理连接。 在这里,我(可能天真地)认为这将只允许最多2个连接,我可以使用阻塞读取处理。 我一直在使用C ++很长一段时间,但对于Linux开发来说,我还是比较新的。 对于上述哪种方法最好(如果有的话),以及如果我对Linux的经验不足意味着其中任何一个都是非常糟糕的想法,我都非常欢迎。 我渴望避免fork()并坚持pthreads,因为传入的modbus请求将被排队并定期从主控制器循环读取。 预先感谢您的任何build议。

为什么Linux的调度程序将两个线程放在具有超线程的处理器的相同物理内核上?

我读过多处,Linux的默认调度程序在多核机器上是超线程感知的 ,这意味着如果你有一台拥有2个真实核心(4 HT)的机器,它不会将两个繁忙的线程调度到逻辑核心上他们都运行在相同的物理内核上(这在很多情况下会导致性能成本的2倍)。 但是当我在英特尔i5-2520M上运行stress -c 2 (产生两个线程在100%的CPU上运行)时, 它经常 将两个线程 调度 (并保持) 到HT核心1和2上,这两个线程映射到相同的物理核心 。 即使系统空闲,否则。 这也发生在真正的程序(我在这里使用stress ,因为它使得它很容易重现),当这种情况发生时,我的程序可以理解需要两倍的时间运行。 使用taskset手动设置亲和力可以修复我的程序,但是我希望HT认知调度程序能够自己正确地做到这一点。 您可以使用egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'findHT->物理核心configurationegrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g' egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g' 。 所以我的问题是:为什么调度程序把我的线程放在同一个物理内核上呢? 笔记: 这个问题与这个问题非常相似,答案就是说Linux有一个非常复杂的HT调度线程调度器 。 如上所述,我无法观察到这个事实(检查自己的stress -c ),并想知道为什么。 我知道我可以为我的程序手动设置处理器关联,例如使用taskset工具或sched_setaffinity函数。 这不是我正在寻找的,我希望调度程序自己知道把两个繁忙的线程映射到一个物理核心并将一个物理核心完全清空并不是一个好主意。 我知道在某些情况下 ,你更喜欢把线程安排在同一个物理核心上,而把另一个核心放在空闲的位置,但是调度程序大概只有1/4的情况似乎是无意义的。 在我看来,它select的HT内核是完全随机的,或者是在调度时活动最less的HT内核,但是这并不是非常了解超线程的,因为考虑到stress特性的程序有多好从单独的物理内核运行。

为了分析(-pg),为什么我的代码在multithreading下比使用单线程运行速度慢?

我正在写一个射线追踪器。 最近,我在该程序中添加了线程,利用我的i5四核上的附加内核。 在奇怪的一系列事件中,应用程序的debugging版本现在运行速度较慢,但​​优化后的版本运行速度比添加线程之前要快。 我将“-g -pg”标志传递给gcc用于debugging构build,并将优化构build的“-O3”标志传递给gcc。 主机系统:Ubuntu Linux 10.4 AMD64。 我知道debugging符号为程序增加了大量的开销,但相对的性能一直保持。 即更快的algorithm在debugging和优化构build中总是运行得更快。 任何想法,为什么我看到这种行为? debugging版本是用“-g3 -pg”编译的。 使用“-O3”优化版本。 Optimized no threading: 0m4.864s Optimized threading: 0m2.075s Debug no threading: 0m30.351s Debug threading: 0m39.860s Debug threading after "strip": 0m39.767s Debug no threading (no-pg): 0m10.428s Debug threading (no-pg): 0m4.045s 这使我确信,“-g3”不是怪怪性能差异的三angular洲,而是“-pg”开关。 “-pg”选项可能会添加某种locking机制来衡量线程性能。 由于“-pg”在线程应用程序中被破坏了,我只是删除它。

如何在使用epoll_wait时正确读取数据

我正尝试将使用IOCP的现有Windows C ++代码移植到Linux。 在决定使用epoll_wait来实现高并发性之后,我已经面临一个理论问题,就是我们何时试图处理接收到的数据。 设想两个线程调用epoll_wait ,并收到两个相应的消息,以便Linux解除第一个线程的epoll_wait ,第二个线程即将到来。 例如: Thread 1 blocks on epoll_wait Thread 2 blocks on epoll_wait Client sends a chunk of data 1 Thread 1 deblocks from epoll_wait, performs recv and tries to process data Client sends a chunk of data 2 Thread 2 deblocks, performs recv and tries to process data. 这种情况是可以想象的吗? […]

单独的线程优先检查使用命令行在Linux中

我可以看到在/ proc / $(pidof任务)/和给予应用程序中使用的线程数 猫的状态。 有没有什么办法来检查Linux中使用命令个人线程优先? 问候, 学习者

线程标识和进程标识之间的关系

我在进程ID和线程ID之间有一些混淆。 我在这里经历了几个包括堆栈溢出的networkingpost,其中说 开始一个新的进程给你一个新的PID和一个新的TGID,而开始一个新的线程给你一个新的PID,同时保持相同的TGID。 所以当我运行一个程序时,为什么从程序创build的所有线程都没有不同的PID? 我知道在编程中我们通常会说main是一个线程 ,执行从main开始,所以如果我从main创build多个线程,所有的线程将有相同的PID,它等于主的PID。 所以我想问的是如下: 1)当我们运行一个程序时,它将作为一个进程或线程运行? 2) 主线程创build线程和进程创build线程是否有区别? 3)在Linux中的线程和进程有什么区别? 因为我读了一些linux不区分Thread和Process的地方。

线程和fork()。 我该如何处理?

可能重复: 分叉在multithreading程序中 如果我有一个使用fork()的应用程序,并且可能被开发为multithreading,那么安全编程这种应用程序需要考虑哪些大拇指规则/准则?

Linux / C ++如何debugging发布应用程序

我有Linux C ++multithreading应用程序。 现在它在生产服务器上进行testing,并具有段错误。 问题在于我无法在任何testing服务器上重现该错误,并且无法访问生产服务器。 我没有转储或任何其他有用的信息。 只有行:segfault在0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0错误6 我想请问社会方面,我可以从这方面得到一些资料,这些资料会减less我可以搜寻的地方的面积。 由于速度慢,我无法运行生产debugging版本。 我可以添加什么来释放哪些帮助我debugging? 这个bug看起来像multithreading的bug,很难重现。 但我不确定,因为应用程序与MTA的许多不同的电子邮件工作。 平台:Linux 编译器行:g ++ -O3 -D_REENTRANT 谢谢。 更新:感谢您的答案。 我可以包含debugging信息。 我想知道debugging发布版本的基本方法。 例如我有转储和发行版本。 我应该如何继续。 我应该读什么呢? 你能用几句话来解释一下如何尽可能地debugging你的应用程序? 谢谢。