Articles of multithreading

易失性和caching行为

我读过post C volatilevariables和Cache Memory 但是我很困惑。 题: 操作系统是否会照顾自己 程序员必须以这样的方式编写程序:variables不应该像提到variables一样被放入caching中,如_Uncached。 问候 学习者

如何使用线程同时下载和转换二进制文件?

我有一个程序,从另一台PC下载一个二进制文件。 我也有另一个独立的程序,可以将这个二进制文件转换为人类可读的CSV。 我想将转换工具“下载到”下载工具中,在下载工具中创build一个启动转换代码的线程(这样它可以在下载时开始转换,减less下载和独立转换的总时间)。 我相信我可以成功地启动另一个线程,但是如何将转换线程与主下载同步? 即转换赶上下载,需要等待更多的下载,然后再开始转换等。 这与multithreading同步执行相似吗? 如果是这样,这意味着下载的二进制文件需要是信号量访问的资源? 我在正确的道路上,还是应该在我开始之前指向另一个方向? 任何意见表示赞赏。 谢谢。

具有multithreadingcurl请求的Segfault

我在这里遇到了一些C ++程序的麻烦。 基本上我已经为http请求写了一个简单的包装,可以一次执行多个请求。 工作绝对好,但是当我做httpS请求时,它在multithreading模式下随机崩溃。 我使用curl和posix线程。 Backtrace看起来像这样: ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x80996)[0x7fea9046d996] /lib/x86_64-linux-gnu/libc.so.6(+0x82b80)[0x7fea9046fb80] /lib/x86_64-linux-gnu/libc.so.6(realloc+0xf2)[0x7fea90470ae2] /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(CRYPTO_realloc+0x49)[0x7fea8f9c6169] /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(lh_insert+0x101)[0x7fea8fa4bfb1] /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(+0xe844e)[0x7fea8fa4e44e] /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(ERR_get_state+0xde)[0x7fea8fa4eeee] /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(ERR_clear_error+0x15)[0x7fea8fa4f065] /usr/lib/x86_64-linux-gnu/libcurl.so.4(+0x24e79)[0x7fea90f10e79] /usr/lib/x86_64-linux-gnu/libcurl.so.4(+0x39ea0)[0x7fea90f25ea0] /usr/lib/x86_64-linux-gnu/libcurl.so.4(+0xf8fd)[0x7fea90efb8fd] /usr/lib/x86_64-linux-gnu/libcurl.so.4(+0x219f5)[0x7fea90f0d9f5] /usr/lib/x86_64-linux-gnu/libcurl.so.4(+0x35538)[0x7fea90f21538] /usr/lib/x86_64-linux-gnu/libcurl.so.4(curl_multi_perform+0x91)[0x7fea90f21d31] /usr/lib/x86_64-linux-gnu/libcurl.so.4(curl_easy_perform+0x107)[0x7fea90f19457] ./exbot[0x40273a] /lib/x86_64-linux-gnu/libpthread.so.0(+0x7f6e)[0x7fea90cd6f6e] /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7fea904e79cd] 这可能是libcrypto中的一个错误? 我可以不知何故告诉curl不要使用libcrypto? 任何替代品? 它只使用httpS请求来启动文件,并且即使10000个同时http查询也能正常工作。 干杯,托马斯 只是为了完整我的代码: // simple wrapper for http requests #ifndef _REQUEST_H_ #define _REQUEST_H_ #include <curl/curl.h> #include <pthread.h> #include <string> #include <iostream> ////////////////////////////////// // MACROS ////////////////////////////////// […]

Qt线程在Linux中的问题

在我的项目中,我一直在用Qt开发一段时间,现在我们开始转向更线程化的devise。 在将一些GL渲染小部件移动到其他线程时,我发现了一些非常奇怪的行为。 看来,如果一个GL Widget从另一个线程(boost线程或QThread)开始更新,然后接受用户input(如QTextEdit)的部件抓住焦点,我会看到如下所示的XCB崩溃: [xcb] Too much data requested from _XRead [xcb] This is most likely caused by a broken X extension library [xcb] Aborting, sorry about that. hypnotizer: ../../src/xcb_io.c:735: _XRead: Assertion '!xcb_xlib_too_much_data_requested' failed. 为了testing这个,我实际上可以对GLHypnotizer演示进行简单的修改来重现崩溃。 该演示可以在这里find: http ://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [qt-project.org] 如果我添加行“mdiArea.addSubWindow(new QTextEdit(this));' (在调用newThread()之前),然后当演示开始时,将会有一个QTextEdit和一个GL Hypnotizer Widget。 如果我然后点击QTextEdit抓住焦点,我会每次都得到上面的崩溃。 任何人都可以重新使用上述说明在Linux上安装错误? 有没有人在Linux上使用Qt和线程之前遇到这些types的问题? 注意:我正在使用Ubuntu 12,这个崩溃发生在VirtualBox和非VirtualBox Ubuntu安装中

订购两个线程的执行

我想写两个线程,第一个将从控制台读取一个string,第二个将输出字符数。 为此,我必须设置执行线程的顺序,先读后写。 另外我想要一个线程执行。 我怎样才能做到这一点? #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *printCharacterNumber(void *ptr); void *readMessage(void *ptr); int main() { pthread_t thread1, thread2; int iret1, iret2; iret1 = pthread_create(&thread1, NULL, printMessage, NULL); iret2 = pthread_create(&thread2, NULL, printCharacterNumber, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); return 0; } void *readMessage(void *ptr) { char *message; fscan("%s", &message); } void *printCharacterNumber(void […]

等待所有线程定时器callback完成的安全方法

在一次性定时器的情况下,我可以使用信号量等待定时器callback完成。 但是,如果定时器被多次发射,这并没有帮助。 考虑下面的代码: #include <stdlib.h> #include <stdint.h> #include <stdio.h> #include <signal.h> #include <time.h> #include <unistd.h> #include <pthread.h> #define N 10 void timer_threaded_function(sigval_t si) { uint8_t *shared_resource = si.sival_ptr; sleep(rand() % 7); /* … manipulate with shared_resource */ return; } int main() { struct sigevent sig_ev = {0}; uint8_t *shared_resource = malloc(123); timer_t timer_id; int i; […]

如何debuggingstrace中显示的futex争用?

我在multithreading的linux进程中debugging一个问题,其中某个线程似乎不会执行几秒钟。 看strace输出显示它等待futex例如 1673109 14:36:28.600329 futex(0x44b8d20,FUTEX_WAIT_PRIVATE, 1673109 14:36:33.221850 <… futex恢复>)= 0 <4.621514> 我怎样才能找出这futex(0x44b8d20)在用户空间引用,即如何映射到一个locking使用futex内部结构。

用原始进程名称生成核心文件

我有一个二进制,将创build多个线程。 现在,当其中一个线程崩溃时,我想要生成的核心文件的名称包含原始进程名称而不是线程名称。 当我使用%e说明符时,它只给出线程名称(我认为这是因为在Linux中,所有线程都被视为LWP)。 如何获得在核心文件名中创build线程的原始进程? 我看了man文件 ,但没有任何其他说明符可以使用。

如果我fork()然后做一个execv(),谁拥有控制台?

我正在编写一个Linux应用程序。 如果我调用fork() ,然后运行一个需要控制台input的应用程序,会发生什么? 考虑下面的代码: int process_id = fork(); if (process_id != 0) { /* this is the parent process */ error = execv("../my_other_app", "parameter1", NULL); if (error < 0) { printf("error!"); } } else { /* this is the child process. Wait for my_other_app to set up */ sleep(3); /* now continue */ } printf("########## […]

python的fcntl.flock函数是否提供文件访问的线程级locking?

Python的fcnt模块提供了一个名为[flock] [1]的方法来certificate文件locking。 它的描述如下: 对文件描述符fd执行锁操作op(也接受提供fileno()方法的文件对象)。 有关详细信息,请参阅Unix手册(2)。 (在某些系统上,这个函数是用fcntl()模拟的。) 查看flock的linux手册页,只涉及到跨进程locking,例如: 对flock()的调用可能会阻止另一个进程持有不兼容的锁。 要做出一个非阻塞的请求,包括LOCK_NB(ORing)与上述任何操作。 所以我的问题是:将flock()还提供线程安全locking和locking同一进程内的多个线程以及来自不同进程的线程? [1]: http : //docs.python.org/library/fcntl.html#fcntl.flockfunction是使用fcntl()模拟的。)