執行緒同步基礎

2021-07-24 12:39:39 字數 1789 閱讀 5594

多個執行緒同時訪問共享資料時可能會衝突。比如兩個執行緒都要把某個全域性變數增加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 執行緒 存放介面子...