Articles of 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你的应用程序? 谢谢。

线程 – 高内存使用率

我正在用C编程,在256Mb系统上在Linux中创build了很多Pthreads。 我通常有+ 200Mb免费。 当我用less量的线程运行程序时,它可以工作,但是一旦我创build了大约100个线程,就会产生错误,因为系统内存不足。 我做了几个testing,每个线程使用几乎2Mb。 线程的堆栈大小设置为16Kb。 我用来创build每个线程的代码: pthread_attr_t attr; pthread_attr_init(&attr); size_t stacksize; stacksize = (double) 16*1024; int res = pthread_attr_setstacksize (&attr, stacksize); int res2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (res != 0 || res2 != 0) { logs << "pthread_attr_XX: error "+int2string(res); exit(-1); } pthread_t id; pthread_create(&id, &attr, &Class::thread_callback, &some_var); 这是正常的还是我错过了什么? 谢谢。

跟踪线程调度

我想要做的是创build一些graphics,详细描述Linux中(两个)线程的执行情况。 我不需要看看线程在做什么,只是在计划时间和时间长短的基础上。 我花了几个小时在互联网上寻找一种方法来跟踪pthreads的调度。 不幸的是,我发现的两个项目需要内核重新编译( LTTng )或glibc修补(NPTL跟踪工具) ,这两者我都做不到(我没有sudo权限的大型集中pipe理系统)。 有没有其他的方式来做这样的事情,或者我将不得不求助于find一台笔记本电脑,我可以补丁/重新编译任何我想要的? 最好的祝福 PS:我会链接到这两个项目,但该网站不允许我(声望<10)。 谷歌的项目名称上的第一个search结果是正确的。