Articles of multithreading

防止Linux线程被调度程序中断

你如何告诉Linux中的线程调度程序不要因为任何原因中断你的线程? 我正在用户模式下编程。 简单地locking一个互斥体是否可以实现这个function? 我想阻止在执行某个函数时调度进程中的其他线程。 他们会阻止,我会浪费cpu周期与上下文切换。 我希望任何执行该函数的线程都能够在不中断的情况下完成执行,即使超过了线程的时间片也是如此。

获取其他线程的回溯

在Linux中,为了获得回溯,可以使用backtrace()库调用,但它只返回当前线程的回溯。 有什么办法得到其他线程的回溯,假设我知道它是TID(或pthread_t),我可以保证睡觉? 看来,libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助。 问题是CentOS不支持它,所以我不喜欢使用它。 任何其他的想法? 谢谢。

在Linux中等待WaitForSingleObject和WaitForMultipleObjects

我正在从Windows到Linux迁移应用程序。 我WaitForSingleObject和WaitForMultipleObjects接口的问题。 在我的应用程序中,我产生了多个线程,其中所有线程都等待来自父进程的事件,或者每t秒周期运行一次。 我已经检查了pthread_cond_timedwait ,但是我们必须为此指定绝对时间。 我怎么能在Unix中实现这个?

OpenSSL和multithreading

我一直在阅读有关如果在multithreading应用程序中使用OpenSSL的要求,您必须使用OpenSSL注册一个线程标识函数(以及一个互斥体创build函数)。 在Linux上,根据OpenSSL提供的例子,一个线程通常是通过注册一个这样的函数来标识的: static unsigned long id_function(void){ return (unsigned long)pthread_self(); } pthread_self()返回一个pthread_t,这在Linux上可行,因为pthread_t只是一个unsigned long的typedef。 在Windows pthreads,FreeBSD和其他操作系统上,pthread_t是一个结构体,结构如下: struct { void * p; /* Pointer to actual object */ unsigned int x; /* Extra information – reuse count etc */ } 这不能简单地转换为无符号长整型,当我尝试这样做时,会抛出一个编译错误。 我尝试了void * p并将其转换为无符号长整型,理论上内存指针应该在线程间是一致且唯一的,但是这只会导致我的程序崩溃。 当使用Windows pthreads或FreeBSD或任何其他类似的操作系统时,我可以使用OpenSSL注册哪些线程识别function? 另外,还有一个问题: 有谁知道这是否也需要完成,如果OpenSSL编译进去,并与QT一起使用,如果是的话如何注册与OpenSSL的QThreads? 令人惊讶的是,我似乎无法在QT的文档中find答案。

C + + 11的std ::线程与Windows CreateThread的

哪个选项更适合在Visual C ++下创build(和pipe理)线程:C ++ 11 std::thread或者WinAPI函数(比如CreateThread , _beginthreadex等),为什么?

来自CreateWindow / CreateDialog的HWND可以从另一个线程获取消息吗?

使用Win32 API,是否可以在一个线程中创build一个窗口或对话框,然后从另一个线程收集事件? HWND是否与线程绑定? 尝试下面的人为的例子,我从来没有看到GetMessage()火。 HWND g_hWnd; DWORD WINAPI myThreadProc(LPVOID lpParam) { while(GetMessage(&msg,hWnd,0,0)> 0) { … } } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { hWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MYDIALOG),0,myDlgProc); CreateThread(NULL,0 myThreadProc,NULL,0,NULL); … } 但在这里,我呢。 HWND g_hWnd; HINSTANCE g_hInstance; DWORD WINAPI myThreadProc(LPVOID lpParam) { hWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MYDIALOG),0,myDlgProc); while(GetMessage(&msg,hWnd,0,0)> 0) { … } } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE […]

是否有任何理由不在Python中混合使用多处理和线程模块

我正在考虑使用Python来实现一个程序,这需要广泛的multithreading。 另一个要求是,它将在桌面上运行,所以有很多进程,将使应用程序看起来凌乱,更难杀(在任务pipe理器中)。 因此,我正在考虑同时使用线程和多处理模块来减less进程的数量。 据我所知,GIL将只适用于一个单一的过程。 我的问题是:是否有任何理由不混合使用这两个模块?

来自目标线程的PostThreadMessage

今天,我看到了一个代码: void Foo() { MyMsgStruct myMsg; /* omission for simplicity */ /* send to update thread */ PostThreadMessage(myThreadId, myMessage, (WPARAM)myMsg, NULL); } 当Foo()从与myThreadId相同的线程中被调用时,会发生什么情况,即从应该是目标线程的同一个线程中myThreadId ? 这是一个性能问题,或只是不好的代码或两者兼而有之? 我相信这可能会影响性能,因为我相信它会将消息排队到线程的队列,而不是做它应该做的事情,因此会稍微减慢程序。 线程安全不是我关心的这个问题 。

是否有必要在退出Win32应用程序之前明确停止所有线程?

我有一个Win32本地VC ++应用程序,进入WinMain()启动一个单独的线程,然后做一些有用的工作,而其他线程正在运行,然后只是退出WinMain() – 另一个线程是不明确停止。 这个博客文章说,在这种情况下,.NET应用程序不会终止,因为另一个线程仍在运行。 这同样适用于本机Win32应用程序吗? 在退出之前是否必须停止所有线程?

如何在Windows上select()中取消等待

在我的程序中,有一个线程(接收线程)负责接收来自TCP套接字的请求,并且有许multithreading(工作线程)负责处理接收到的请求。 一旦请求被处理,我需要通过TCP发送一个答案。 这是一个问题。 我想用与接收数据相同的线程发送TCP数据。 接收数据后的这个线程通常会等待select()新数据。 因此,一旦工作线程完成处理请求并在输出队列中input答案,它必须向接收线程发送有数据要发送的信号。 问题是,我不知道如何取消select()中的等待,以便退出等待并调用send() 。 或者我应该使用另一个线程来通过TCP发送数据? 更新 MSalters,Artyom谢谢你的回答! MSalters,阅读你的答案我发现这个网站: Winsock 2 I / O方法和阅读有关WSAWaitForMultipleEvents() 。 我的程序实际上必须在HP-UX和Windows上都能正常工作。我终于决定使用Artyom提出的方法。