Linux多執行緒程式設計(2)執行緒同步

2021-07-03 06:57:33 字數 1583 閱讀 8980

執行緒同步

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張票,由兩個執行緒來...