Articles of multithreading

当使用Windows线程时,我可以指定一个缓冲区用于线程的堆栈,类似于pthread_attr_setstack()?

pthreads允许用户提供一大块内存用于线程堆栈: size_t stack_size = 1024*1024*4; void *stack = malloc( stack_size ); pthread_attr_t attributes; pthread_attr_init( &attributes ); pthread_attr_setstack( &attributes, stack, stack_size ); pthread_t thread_id; pthread_create( &thread_id, &attributes, worker_function, NULL Windows线程是否提供类似的function? CreateThread的第二个参数允许指定堆栈的最小大小,但是我看不到指定要使用的缓冲区地址的方法。

创build暂停/可恢复线程的最佳方法是什么?

我正在做一些networking编程的微处理器发送低缓冲区通知,我有一个线程,写一个设置的信息量。 完成后,需要进入挂起状态并等待低缓冲区通知恢复。 使用Windows的线程池API,还是使用CreateThread()创build的线程更好?

易失性和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文件 ,但没有任何其他说明符可以使用。