【发布时间】:2017-12-20 04:43:42
【问题描述】:
我想编写一个程序,它可以在没有主线程的情况下停止(挂起)所有其他 pthread,我使用pthread_kill 向目标线程发送信号以调用其信号处理程序,该处理程序可以自行阻塞。但我被卡住了。下面是代码:
#include <iostream>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <cassert>
using namespace std;
pthread_mutex_t _mutex;
pthread_cond_t cond;
void cur_thread_wait(int sig)
{
cout << pthread_self() << endl;
// pthread_mutex_lock(&_mutex);
pthread_cond_wait(&cond, &_mutex);
// pthread_mutex_unlock(&_mutex);
}
void signal_all()
{
pthread_cond_broadcast(&cond);
}
void *print(void *)
{
pthread_detach(pthread_self());
for (int i = 0; i < 100; i ++) {
cout << dec << i << endl;
}
return nullptr;
}
int main(int argc, char *argv[])
{
pthread_mutex_init(&_mutex, nullptr);
pthread_cond_init(&cond, nullptr);
signal(SIGUSR1, cur_thread_wait);
pthread_t pid1, pid2, pid3;
pthread_create(&pid1, nullptr, print, nullptr);
pthread_create(&pid2, nullptr, print, nullptr);
pthread_create(&pid3, nullptr, print, nullptr);
// usleep(400);
pthread_kill(pid1, SIGUSR1);
pthread_kill(pid2, SIGUSR1);
pthread_kill(pid3, SIGUSR1);
signal_all();
pthread_exit(nullptr);
}
事实上,我认为真的没有必要创建mutex(这是真的吗?)...我是linux 编程的新手。我该如何解决这个问题?谢谢。
【问题讨论】:
-
这是坏的 - 你不应该在信号处理程序中阻塞!
标签: c++ linux multithreading pthreads