【问题标题】:sending signals to threads向线程发送信号
【发布时间】:2015-03-19 08:30:20
【问题描述】:

我正在实现一个使用线程的程序。我希望每个创建的线程都延迟一段时间。然后向线程发送一个信号,处理程序应该打印一条消息。我的问题是向线程发送信号。怎么可能向每个创建的线程发送警报信号? 我可以使用pthread_kill(),但是如何指定时间,如alarm(6) 之类的?

void *thread(void *parameter)
{
       //How to send a signal to a thread
}
void threadHandler(int sig)
{
    printf("hello from thread\n");
}

【问题讨论】:

  • 为什么不让主线程处理信号并向线程广播条件?
  • 因为每个线程会有不同的延迟。
  • @user4546686:您这样做只是为了学习还是尝试解决特定问题?我可以发布一种我认为至少可以在 Linux 上运行的方法,但根据您的操作,可能会有更好的方法。
  • 仅供学习使用

标签: c signals


【解决方案1】:

好吧,一种可能性是使用例如,使一个额外的线程休眠给定的时间。 usleep 然后使用 pthread_kill 将要发送的信号发送到正确的线程。如果你例如想发送三个信号,经过 1、3 和 5 秒后,可以使用这段代码:

usleep(1*1000*1000);
pthread_kill(thread1, SIGALRM);
usleep(2*1000*1000);
pthread_kill(thread2, SIGALRM);
usleep(2*1000*1000);
pthread_kill(thread3, SIGALRM);

如果您在 Linux 上,您可以使用 timerfd_create() 创建一个计时器文件描述符,在给定的时间过去后可以从中读取数据。所以,如果你有例如10 个线程,您可以使用特定于线程的超时创建 10 个 timerfds,然后使用 epoll_wait() 循环(请参阅 epoll_create 和 epoll_wait 手册页)侦听要从 timerfds 读取的数据,并在那里将信号发送到正确的线程是要读取的数据。

我认为没有任何现成的接口可以在经过特定时间后向特定线程发送 SIGALRM 信号,但是如果可以选择创建额外的线程,则绝对可以使用 usleep( ) 或 timerfd_create() / epoll_wait()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多