Articles of multithreading

为了分析(-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结果是正确的。

C linux pthread线程优先

我的程序有一个后台线程来填充和交换双缓冲区实现的后台缓冲区。 主线程使用前端缓冲区发送数据。 问题是主线程运行程序时平均得到更多的处理时间。 我想要相反的行为,因为填充后台缓冲区是一个更耗时的过程,然后处理并发送数据到客户端。 我怎样才能在Linux上用C POSIX pthreads来实现呢?

pthread – 如何开始运行一个新的线程,而无需调用连接?

我想从主线程开始一个新的线程。 我不能使用连接,因为我不想等待线程退出并继续执行。 基本上我需要的是类似pthread_start(…),虽然找不到它。 编辑: 由于所有的答案build议create_thread应该开始线程的问题是,在简单的代码下面,它不工作。 下面程序的输出是“主线程”。 这似乎是从未执行的子线程。 任何想法,我错了? 编译并运行在Fedora 14 GCC 4.5.1版上 void *thread_proc(void* x) { printf ("sub thread.\n"); pthread_exit(NULL); } int main() { pthread_t t1; int res = pthread_create(&t1, NULL, thread_proc, NULL); if (res) { printf ("error %d\n", res); } printf("main thread\n"); return 0; }