Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Pthread使用Pthread_cond_wait in signal handle阻塞_C++_Linux_Multithreading_Pthreads - Fatal编程技术网

C++ Pthread使用Pthread_cond_wait in signal handle阻塞

C++ Pthread使用Pthread_cond_wait in signal handle阻塞,c++,linux,multithreading,pthreads,C++,Linux,Multithreading,Pthreads,我想写一个程序,它可以停止(挂起)没有主线程的所有其他pthread,我使用pthread\u kill向目标线程发送一个信号来调用它的信号处理程序,它可以阻止自己。但是我被卡住了。下面是代码: #include <iostream> #include <signal.h> #include <pthread.h> #include <unistd.h> #include <cassert> using namespace std;

我想写一个程序,它可以停止(挂起)没有主线程的所有其他pthread,我使用
pthread\u 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);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
pthread_mutex_t_mutex;
pthread_cond_t cond;
无效当前线程等待(int sig)
{
cout在调用
pthread\u cond\u wait
之前,您确实需要锁定互斥体;它希望它被锁定,然后解锁,等待条件变量被断言,然后在返回给您之前重新锁定它

pthread\u cond\u wait(3p)

int pthread_cond_wait(pthread_cond_t*restrict cond,
pthread_mutex_t*restrict mutex);
pthread\u cond\u timedwait()
pthread\u cond\u wait()
函数应在条件变量上阻塞。应用程序应确保在调用线程锁定互斥锁的情况下调用这些函数;否则会出现错误(对于
pthread\u mutex\u ERRORCHECK
和健壮互斥锁)或未定义的行为(对于其他互斥体)结果


谢谢。我发现了我的错误…如果我把
usleep
放在
signal\u all
之前,程序运行正常。此外,你是对的,因为
mutex
是必需的。谢谢更新!你也可以在大多数系统(包括Linux)上使用
sched\u yield
此外,由于信号标记为C++,所以由于问题被标记为C++,所以杀死和取消POSIX线程会在C++中引起问题。