Pthread使用pthread_cond_wait内部信号句柄被阻止

时间:2017-12-20 04:43:42

标签: c++ linux multithreading pthreads

我想编写一个可以在没有主线程的情况下停止(挂起)所有其他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编程的新手。我该如何解决这个问题?谢谢。

1 个答案:

答案 0 :(得分:1)

需要在调用pthread_cond_wait之前锁定互斥锁;它期望它被锁定,它解锁它,等待条件变量被断言,然后在返回给你之前重新锁定它。

来自pthread_cond_wait(3p)

int pthread_cond_wait(pthread_cond_t *restrict cond,
    pthread_mutex_t *restrict mutex);
  

pthread_cond_timedwait()pthread_cond_wait()函数应阻止条件变量。应用程序应确保在调用线程锁定 mutex 的情况下调用这些函数;否则,错误(对于PTHREAD_MUTEX_ERRORCHECK和强健的互斥锁)或未定义的行为(对于其他互斥锁)结果。