gpt4 book ai didi

c++ - Pthread 在信号句柄中使用 pthread_cond_wait 阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:55 24 4
gpt4 key购买 nike

我想写一个程序可以停止(挂起)所有其他 pthreads 而不是主线程,我使用 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 编程的新手。我该如何解决这个问题?谢谢。

最佳答案

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

来自 pthread_cond_wait(3p):

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

The pthread_cond_timedwait() and pthread_cond_wait() functions shall block on a condition variable. The application shall ensure that these functions are called with mutex locked by the calling thread; otherwise, an error (for PTHREAD_MUTEX_ERRORCHECK and robust mutexes) or undefined behavior (for other mutexes) results.

关于c++ - Pthread 在信号句柄中使用 pthread_cond_wait 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47898916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com