Linux 執行緒安全問題

2021-10-06 02:36:24 字數 1981 閱讀 8575

一、執行緒安全的定義

執行緒安全就是在多執行緒執行的時候,不論執行緒的排程順序怎樣,最終的結果都是一樣的,正確的,那麼就說這些執行緒是安全的。

二、如何保證執行緒是安全的

1、對執行緒同步,保證同一時刻只有乙個執行緒訪問臨界資源

先看一段執行緒不安全的**

#include

#include

#include

#include

#include

#include

int g =0;

void

*fun

(void

*arg)

}int

main()

pthread_join

(id,

null);

//保證函式執行緒已經結束了

printf

("g = %d\n"

, g)

;exit(0);}

執行之後我們發現,每次執行的結果都不一樣:

因為執行緒安全的定義來說:論執行緒的排程順序怎樣,最終的結果都是一樣的。這說明此執行緒是不安全的。那為什麼不安全呢?

#include

#include

#include

#include

#include

#include

int g =0;

pthread_mutex mutex;

void

*fun

(void

*arg)

}int

main()

pthread_join

(id,

null);

//保證函式執行緒已經結束了

printf

("g = %d\n"

, g)

;exit(0);}

執行結果:

這裡可以看到,每次執行的結果都是一樣的

2、在多執行緒中使用執行緒安全的函式(可重入函式),所謂執行緒安全的函式指的是:如果乙個函式能被多個執行緒同時呼叫且不發生競態條件,則我們認為它是執行緒安全。

先看一段不安全的**

#include

#include

#include

#include

#include

#include

void

*fun

(void

*arg)

}int

main()

pthread_exit(0);}

執行結果如下:

我們發現主線程每次列印的時候不僅有字母還有數字。這樣的執行緒是不安全的。

#include

#include

#include

#include

#include

#include

void

*fun

(void

*arg)

}int

main()

pthread_exit(0);}

執行結果如下:

我們發現主線程永遠切割的是字元,函式執行緒切割的是數字,這樣執行緒就安全了。

執行緒安全問題

執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...

執行緒安全問題

是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...

執行緒安全問題

由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....