執行緒同步 條件變數

2022-08-01 08:30:10 字數 1074 閱讀 7590

條件變數可以說是執行緒同步中運用最多的方式。最常見的是運用在消費者-生產者模型中。

一般由乙個執行緒充當生產者,乙個執行緒充當生產者。消費者需要等到足夠量的資料才來消耗資料。在這中間生產者產生資料,並在資料量足夠時發訊號通知消費者取資料。

程序間的同步可以用訊號量實現(sem_open時設定訊號量初始值為0, sem_wait等待條件滿足,sem_post在條件滿足後發訊號)

先寫乙個簡單的sample來演示這個過程(用佇列中的**稍作修改)

#include

#include

#include

typedef struct _listnodelistnode;

typedef struct _listlist;

void list_init(list *plist)

void list_insert_tail(list *plist, listnode *node)

else

plist->tail = node;

plist->len++;

}void list_remove(list *plist, listnode* node)

else

if (plist->head == node)

else

if (node != null)

}list _list;

pthread_mutex_t mutex;//最好的方式是將mutex和cond放到list結構體中。

pthread_cond_t cond;

void *produce_thread(void *param)

pthread_mutex_unlock(&mutex);

sleep(1);}}

void *consume_thread(void *param)

}sleep(1);

}pthread_mutex_unlock(&mutex);}}

int main(void)

執行結果如下:

執行緒同步 條件變數

當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...

執行緒同步 條件變數

1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...

執行緒同步 條件變數

多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...