pthread_cond_timedwait的教训

写给自己看的

说明:

根据代码总结 pthread_cond_timedwait 只有在先获得锁的情况下才能使用,未获得锁的情况下使用将导致不能获得锁。

  1. 由于条件会被wait线程读取,被signal/broadcast线程修改,即写入。为了防止出现竞争,需要和mutex一起使用,使用mutex来保护条件。
  2. 在mutex已经锁住的情况下,才能调用wait。
  3. 由于spurious wakeup(虚假唤醒)的原因,wait函数返回并不代表条件已经成立,在wait函数返回后,需要再次判断条件是否成立。因此需要将wai调用放到while循环中。

这是最初的函数:

(其实应该用个共享变量,作为条件,而不是只用mutex,cond)

void *thread0(void* arg){
    int i = pthread_self(), ret = 0;
    pthread_cleanup_push(&cleanup, &i);
    int loop = 0;
    cout<<"thread0 start"<

最后的代码:

其实改了之后完全没用用到条件变量。只不过我懒得删。

#include "pthread.h"
#include "sys/time.h"
#include "errno.h"
#include "string.h"
#include "unistd.h"
#include "iostream"

using namespace std;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void cleanup(void* arg){
    int i = *(int*)arg;
    cout<<"thread "<

你可能感兴趣的:(操作系统)