多執行緒對臨界資源執行自增

2021-10-12 04:21:08 字數 1939 閱讀 5848

#include #include #include #include #include #define thread_count	10

void *thread_callback(void *arg)

}int main() ;

int i = 0;

int count = 0;

for (i = 0; i < thread_count; i++)

for(i = 0; i < 100; i++)

}

十個執行緒同時對count自行自增十萬次,結果count並不是十萬。

原因如下:

1、取count

2、自增

3、將count放回

在理想情況中不同執行緒會乙個執行緒執行完,執行緒切換,另乙個執行緒再接著執行。但是也有不理想的情況:

執行緒m取count,這時進行執行緒切換,執行緒n也取count。這時count_m和count_n是相等的,他們自增後再放回,雖然自增了兩次,但實際上count只增加了1

所以需要對臨界資源加鎖。

#include #include #include #include #include #define thread_count	10

pthread_mutex_t mutex; // 宣告全域性變數mutex

void *thread_callback(void *arg)

}int main() ;

pthread_mutex_init(&mutex, null); // 初始化mutex

int i = 0;

int count = 0;

for (i = 0; i < thread_count; i++)

for(i = 0; i < 100; i++)

}

#include #include #include #include #include #define thread_count	10

pthread_mutex_t mutex;

pthread_spinlock_t spinlock; // 這裡不一樣

void *thread_callback(void *arg)

}int main() ;

pthread_mutex_init(&mutex, null);

pthread_spin_init(&spinlock, pthread_process_shared); // 這裡不一樣

int i = 0;

int count = 0;

for (i = 0; i < thread_count; i++)

for(i = 0; i < 100; i++)

}

寫法可以說和mutex一模一樣

自旋鎖相當於乙個while(1),當臨界資源被占用,他會不停地詢問是否可以呼叫。

互斥鎖則是如果乙個執行緒申請臨界資源發現其被占用的時候,會引起執行緒的切換,讓出cpu,等待下一次被呼叫。

分別什麼時候用?

不用鎖可以麼?

原子操作

cas --> conpare and swap --> 比較交換

無鎖佇列

if(a == b)
詳細介紹.

多執行緒程式設計 臨界區

1 windows api建立執行緒 include 包含相應標頭檔案 include dword winapi myfun1 lpvoid lpparameter 宣告執行緒函式 dword winapi myfun2 lpvoid lpparameter int main 主函式 else 如果...

多執行緒系列 競態臨界區 共享資源

在同一程式中執行多個執行緒本身不會導致問題,問題只有在一或多個執行緒向這些資源做了寫操作時才有可能發生,只要資源沒有發生變化,多個執行緒讀取相同的資源就是安全的。多執行緒同時執行下面的 可能會出錯 1publicclasscounter 6 想象下執行緒a和b同時執行同乙個counter物件的add...

Linux多執行緒臨界區問題

臨界區指的是乙個訪問共用資源 例如 共用裝置或是共用儲存器 的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待,有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用,例如 semaphore。只能被單一執...