c - 在错误的线程中调用信号处理程序

标签 c multithreading signals interrupt

我想知道是否可以中断主线程并要求它执行一些回调。主线程应该在完成回调后继续它正在做的事情。

例如,我们有 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/

相关文章:

java - 如何检查 2 秒内发生了多少事件? (定时器)

c - C 中的 Alarm() 和 SIGALRM 问题

linux - SIG_IGN 不适用于 PTRACE_TRACEME?

c - 如何在 C 中使用 strcat 连接 short 和 char 数组

c - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DeviceControl 函数未被调用

c - 如何禁用 "curses.h" header (Xcode 6.3 OSX Yosemite 中“stdio.h 的一部分”)以避免函数声明冲突

linux - Bash 脚本捕获信号但之后等待进程终止

c - 实验 : Object Oriented C?

c# - 暂停线程直到手动恢复

c# - 预订剧院座位