首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程在循环中等待信号

线程在循环中等待信号
EN

Stack Overflow用户
提问于 2013-09-24 21:46:14
回答 2查看 1.8K关注 0票数 1

我是C中的新手,我想创建一个程序,其中两个线程将在一个循环中发送信号(SIGUSR1和SIGNUSR2),另一个线程将等待并处理这些信号。

我知道发送信号是我需要做的:kill(getpid,SIGUSR1);,但是如何创建四个线程来等待信号呢?该信号被注册到特定的功能中。四个线程将如何等待相同的信号?

我是否可以让其他线程也检查信号的类型(而不阻止信号到达其他线程)?

谢谢。

更新:

我试图让四个线程等待信号,当两个线程发送信号时,线程不知道哪个线程会捕获信号。我不想指定接收信号的线程id。

在使用pthread_kill()时,我需要指定线程id (这是我不想做的)。

EN

回答 2

Stack Overflow用户

发布于 2013-09-24 21:51:12

更新:这个答案可能部分无用。您应该使用pthread_kill向特定线程发送信号。不过,如果有人在里面发现了什么,我就把它留下。

在Linux上,线程不能用kill处理,因为kill会将信号发送给任何没有阻塞信号的随机线程。

相反,您需要tgkill系统调用,它以特定线程为目标。哪根线?您可以使用系统调用gettid进行查找。

不幸的是,glibc没有为这两个系统调用提供包装器。没问题,你可以自己写:

代码语言:javascript
复制
#include <signal.h>
#include <sys/syscall.h>
#include <sys/types.h>

pid_t gettid()
{
    return syscall(SYS_gettid);
}

int tgkill(int sig, pid_t pgid, pid_t tid)
{
    return syscall(SYS_tkill, sig, pgid, tid);
}

tgkill的第一个参数是信号,比如kill。第二个是线程组id,它与进程的进程id相同(可以用getpid获得)。最后一个参数是内核线程id,这是您在gettid中获得的,它也构成了Linux上/proc/<pid>/task/中的目录。

最后,你需要能够等待一个信号的到来。您可以通过用pthread_sigmask阻塞线程中的信号,然后使用sigtimedwait来实现这一点。

代码语言:javascript
复制
// block signal
sigset_t newset, oldset;
sigemptyset(&nweset);
sigaddset(&newset, SIGUSR1);
pthread_sigmask(SIG_BLOCK, &newset, &oldset);

// wait
sigwaitinfo(&newset, NULL);

// restore previous signal mask
pthread_sigmast(SIG_SETMASK, &oldset, NULL);
票数 2
EN

Stack Overflow用户

发布于 2013-09-25 02:26:08

我真的不建议使用SIGUSR信号进行线程同步。如果你想让线程等待一个信号,我会查看pthread_cond_signal的手册页

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18992614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档