c-是否可以将pthread条件变量(pthread_mutex和pthread_cond_t)与多个条件一起使用



我有一个多线程程序,每个线程都专注于自己的工作。当线程完成其工作时,它将把事件驱动到主线程。

所以我想使用pthread条件变量来实现这个想法(即pthread_cond_t和pthread_mutex_t(。数据结构如下:

typedef struct peer_info {
int ip; 
int port;
pthread_mutex_t peer_mutex;
pthread_cond_t peer_cond;
bool write_v;
bool read_v;
bool create_v;
bool destroy_v;
} peer_info;

假设:
thread1更改write_v并向主线程发送信号,
hread2更改read_v并向主线程发送信息,
thread3更改create_v并向北线程发送信号;
线程4更改destroy_v并为主线程发送信息。

是否可以只使用一个pthread_mutex和pthread_cond_t来实现上述场景?这会造成僵局吗?

是的,您可以安全地等待;复合谓语,";其中一个信号表示"1";此状态更改了该状态更改了或其他状态更改了或[/em>">

在您的情况下,这些状态是您设置的event_v标志。假设您的主线程处于循环中,并且event_v标志被初始化为false,它看起来像这样:

// main loop:
pthread_mutex_lock(&pi.peer_mutex);
while (! (pi.write_v || pi.read_v || ... )) {
pthread_cond_wait(&pi.peer_cond, &pi.peer_mutex);
}
if (pi.write_v) {
pi.write_v = false; // clear this so we're not confused next time we wake up
handle_write_event(&pi);
}
if (pi.read_v) {
pi.read_v = false;
handle_read_event(&pi);
}
if (...) ...          // handle other events

请注意,这将在互斥锁被锁定时处理事件,这对您来说可能正常,也可能不正常。

顺便说一句,我发现所有这些布尔标志都有点麻烦,可能会使用位标志:

#define PEER_EVENT_READ  1 << 0
#define PEER_EVENT_WRITE 1 << 1
#define PEER_EVENT_ ...
struct peer_info {
short events_pending; // initialized to zero
...
};

这样我就可以简洁地写:

while (! pi.events_pending) {
pthread_cond_wait(&pi.peer_cond, &pi.peer_mutex);
}
if (pi.events_pending & PEER_EVENT_READ) { ... }
if ....
pi.events_pending = 0; // clear them all

但它在语义上是一样的,所以取决于你。

最新更新