我想知道是否可以中断主线程并要求它执行一些回调。主线程应该在完成回调后继续它正在做的事情。
例如,我们有 2 个线程 t1 和 m1(主线程)。 t1 将中断 m1(主线程)并要求它调用带有一些参数的函数。 m1(主线程)将停止做它之前正在做的事情,并开始执行函数。完成该功能后,它将恢复到之前的状态。
我想复制硬件中断的作用。我有一个从文件中读取数据的线程。然后它应该要求主线程调用一个函数。主线程会做一些事情。它应该停止这样做并开始执行该功能。完成后,主线程应该继续它正在做的事情
我使用信号编写了以下代码
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
static void catch_function(int signo) {
int id = GetCurrentThreadId();
printf("\nThread ID is %d",id);
signal(SIGINT, catch_function);
}
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
int id = GetCurrentThreadId();
printf("\nChild Thread ID is %d",id);
while(1)
{
Sleep(50);
if (raise(SIGINT) != 0) {
fputs("Error raising the signal.\n", stderr);
return EXIT_FAILURE;
}
}
return 0;
}
int main(void) {
int id = GetCurrentThreadId();
printf("\nMain Thread ID is %d",id);
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr);
return EXIT_FAILURE;
}
HANDLE thread;
DWORD threadId;
thread = CreateThread(NULL, 0, &MyThreadFunction, NULL, 0, &threadId);
if(!thread)
{
printf("CreateThread() failed");
}
while(1)
{
Sleep(50);
}
return 0;
}
代码的输出是
Main Thread ID is 6124
Child Thread ID is 7854
Thread ID is 7854
Thread ID is 7854
所以我的问题是不应该在主线程中调用信号处理程序吗?我希望主线程调用处理函数而不是引发信号的线程? 请让我知道实现此目标的正确方法是什么。
附言。我必须为 Windows 和 Linux 都这样做。
最佳答案
我只能从 Linux 方面提供建议,但正如您所说,那时候也很有趣...
... raise
执行以下操作(来自手册页):
The raise() function sends a signal to the calling process or thread.
因此在多线程程序中,调用 raise 的线程将获得信号。
在 Linux 上,对于线程,您可能会使用 pthreads,在这种情况下您有 pthread_kill
,它会向特定线程发送特定信号。您需要在主线程中使用 pthread_self
来获取线程 ID,然后将其传递给工作线程。然后工作线程可以直接向主线程发送信号。
我怀疑您需要为 Windows 找到类似的东西,但我不知道那是什么。
关于c - 在错误的线程中调用信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31461171/