多個執行緒同時訪問共享資料時可能會衝突。比如兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成:
1.從記憶體讀變數值到暫存器
2.暫存器的值加1
3.將暫存器的值寫回記憶體
假設兩個執行緒在多處理器平台上同時執行這三條指令,則可能導致上圖所示的結果,最後變數只加了一次而非兩次
#include #include #include #define nloop 1000
int counter; /* incremented by threads */
void *doit(void *);
int main(int argc, char **argv)
void *doit(void *vptr)
return null;
}
用注釋中的1,2,3模擬三步指令
實驗結果:
3dcac700: 1011
3dcac700: 1012
3dcac700: 1013
3dcac700: 1014
3dcac700: 1015
3dcac700: 1016
3dcac700: 1017
3dcac700: 1018
3dcac700: 1019
3dcac700: 1020
3dcac700: 1021
並沒有加到2000
執行緒為什麼要同步
1.共享資源,多個執行緒都可對共享資源操作
2.執行緒操作共享資源的先後順序不確定
3.處理器對儲存器的操作一般不是原子操作
解決辦法:
#include #include #include #define nloop 1000
pthread_mutex_t mutex = pthread_mutex_initializer;
int counter; /* incremented by threads */
void *doit(void *);
int main(int argc, char **argv)
void *doit(void *vptr)
return null;
}
死鎖:1.同乙個執行緒在擁有a鎖的情況下再次請求獲得a鎖
2.執行緒一擁有a鎖,請求獲得b鎖;執行緒二擁有b鎖,請求獲得a鎖死鎖導致的結果是什麼?
#include #include #include pthread_mutex_t mutexa = pthread_mutex_initializer;
pthread_mutex_t mutexb = pthread_mutex_initializer;
int counter; /* incremented by threads */
void *doita(void *);
void *doitb(void *);
int main(int argc, char **argv)
void *doita(void *vptr)
void *doitb(void *vptr)
執行緒基礎與執行緒同步
二 執行緒同步 我們都知道,程序是運轉中的程式,是為了在cpu上實現多道程式設計而發明的乙個概念。但是程序在乙個時間只能幹一件事情,如果想要同時幹兩件或者多件事情,例如同時看兩場電影,我們自然會想到傳說中的分身術,就像孫悟空那樣可以變出多個真身。雖然我們在現實中無法分身,但程序卻可以辦到,辦法就是執...
java基礎 執行緒同步
一 先看程式 public class timer1 catch interruptedexception e system.out.println name 你是第 num 個使用timer的執行緒 public class testsync1 implements runnable public...
多執行緒同步基礎
主線程執行完要等待其他執行緒執行完,才退出虛擬機器 實現方式和繼承方式的區別 實現方式好處避免了但繼承的侷限性 不能繼承其他類,只能繼承thread類 定義執行緒時,建議使用實現方式。兩種方式區別 繼承thread 執行緒 存放thread子類的run方法中 實現runnable 執行緒 存放介面子...