gpt4 book ai didi

multithreading - 需要知道如何中断所有pthread

转载 作者:行者123 更新时间:2023-12-03 13:17:22 24 4
gpt4 key购买 nike

在Linux中,我正在仿真一个嵌入式系统,该系统具有一个线程,该线程可以将消息传递到外界。如果某个线程检测到无法解决的问题,我的目标是停止所有其他线程在它们的轨道中(保留有用的堆栈跟踪),并仅允许消息传递线程继续运行。因此,在我的仿真环境中,我想每个“tid”都“pthread_kill(tid,SIGnal)”。 (我有一个列表。我正在使用SIGTSTP。)不幸的是,只有一个线程正在接收信号。 “sigprocmask()”无法取消屏蔽信号。这是我当前(无效)的处理程序:

void
wait_until_death(int sig)
{
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, sig);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
for (;;)
pause();
}

我得到所有pthread_kill()都被调用的验证,但是只有一个线程在堆栈跟踪中具有处理程序。能做到吗?

最佳答案

这个最小的示例似乎以您想要的方式起作用-除主线程之外的所有线程最终都在wait_until_death()中等待:

#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>

#define NTHREADS 10
pthread_barrier_t barrier;

void
wait_until_death(int sig)
{
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, sig);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
for (;;)
pause();
}

void *thread_func(void *arg)
{
pthread_barrier_wait(&barrier);

for (;;)
pause();
}

int main(int argc, char *argv[])
{
const int thread_signal = SIGTSTP;
const struct sigaction sa = { .sa_handler = wait_until_death };
int i;
pthread_t thread[NTHREADS];

pthread_barrier_init(&barrier, NULL, NTHREADS + 1);
sigaction(thread_signal, &sa, NULL);

for (i = 0; i < NTHREADS; i++)
pthread_create(&thread[i], NULL, thread_func, NULL);

pthread_barrier_wait(&barrier);

for (i = 0; i < NTHREADS; i++)
pthread_kill(thread[i], thread_signal);

fprintf(stderr, "All threads signalled.\n");

for (;;)
pause();

return 0;
}

请注意,不需要在 wait_until_death()中解除对信号的阻塞:信号掩码是按线程的,并且不会再次用信号通知正在执行信号处理程序的线程。

大概问题在于您如何安装信号处理程序或设置线程信号掩码。

关于multithreading - 需要知道如何中断所有pthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com