執行緒同步
a. mutex (互斥量)
多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重要性是同樣的問
題。假如 兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成:
1. 從記憶體讀變數值到暫存器
2. 暫存器的值加1
3. 將暫存器的值寫回記憶體
我們通過乙個簡單的程式觀察這一現象。上圖所描述的現象從理論上是存在這種可能的,但實際執行程式時很難觀察到,為了使現象更容易觀察到,我們把上述三條指令做的事情用更多條指令來做:
我們在「讀取變數的值」和「把變數的新值儲存回去」這兩步操作之間插入乙個printf呼叫,它會執 行write系統呼叫進核心,為核心排程別的執行緒執行提供了乙個很好的時機。我們在這個迴圈中重 復上述操作幾千次,就會觀察到訪問衝突的現象
。**:
#include#include#include#define nloop 5000
static int g_val = 0;
void *read_write_mem(void* arg)
list_node_t;
list_node_t *head;
void init_list(list_node_t *p)
void *product()
return null;
}void *consumer()
q = head;
head = head->next;
q->next = null;
pthread_mutex_unlock(&lock);
printf("consumer done... %d\n",q->product);
free(q);
q = null;
} return null;
}
#include"comm.h"
void *product_run(void *arg)
void *consumer_run(void *arg)
int main()
//makefile
prod_cons_model:main.o comm.o
gcc -o prod_cons_model main.o comm.o -lpthread
main.o:main.c comm.h
gcc -c main.c
comm.o:comm.c comm.h
gcc -c comm.c
.phony:clean
clean:
rm *.o prod_cons_model
執行結果:
多執行緒程式設計2 執行緒同步
訊號量 訊號量通常有兩種 二進位制訊號量和計數訊號量。二進位制訊號量只有0和1兩種取值,計數訊號量有更大的取值範圍。訊號量一般用來保護一段 使其每次只能被乙個執行執行緒執行,要完成這個工作,可以使用二進位制訊號量。有時,希望可以允許有限數目的執行緒執行一段指定的 這時可以使用計數訊號量。建立 inc...
多執行緒程式設計 2 執行緒的同步
在 多執行緒程式設計 系列第一篇講述了如何啟動執行緒,這篇講述執行緒之間存在競爭時如何確保同步並且不發生死鎖。執行緒不同步引出的問題 下面做乙個假設,假設有100張票,由兩個執行緒來實現乙個售票程式,每次執行緒執行時首先檢查是否還有票未售出,如果有就按照票號從小到大的順序售出票號最小的票,程式的 如...
多執行緒程式設計 2 執行緒的同步
多執行緒程式設計 2 執行緒的同步 分類 c 基礎 2010 01 10 20 18 5463人閱讀 34 收藏舉報 在 多執行緒程式設計 系列第一篇講述了如何啟動執行緒,這篇講述執行緒之間存在競爭時如何確保同步並且不發生死鎖。執行緒不同步引出的問題 下面做乙個假設,假設有100張票,由兩個執行緒來...