Linux 執行緒深度剖析(二),拿下執行緒安全

2021-10-10 17:15:25 字數 3346 閱讀 8381

條件變數(pcb等待佇列)

舉個例子:

結果與我們的初衷完全不一樣,這就是執行緒完全問題。

互斥鎖中的計數器如何保證原子性?

獲取資源的時候:

1.暫存器中的值賦值為0

2.將暫存器中的值與記憶體的值交換

3.判斷暫存器的值,得出結果

在第二步交換的過程中,系統通過xchgb交換操作,該操作是彙編**,一次性完成,該操作保證了原子性。

1.互斥鎖的初始化

int

pthread_mutex_init

(pthread_mutex_t *_mutex,_const pthread_mutex_mutexattr_t* _mutexattr)

2.加鎖

int

pthread_mutex_lock

(pthread_mutex_t *mutex)

;

3.解鎖

int

pthread_mutex_unlock

(pthread_mutex_t*mutex);

4.互斥鎖的銷毀

pthread_mutex_destroy (pthread_mutex_t*

);

建立四個執行緒,每個執行緒在搶票時候進行加鎖,結束後解鎖。

注意:

它可以使用在資源不滿足的情況下處於休眠狀態,讓出cpu資源,而資源狀態滿足時喚醒執行緒

1.初始化

int

pthread_cond_init

(pthread_cond_t* cond,pthread_condattr_t* attr)

2.等待:將呼叫該介面的執行緒放到pcb等待佇列當中

int

pthread_cond_wait

(pthread_cond_t* cond,pthread_mutex_t* mutex)

;

3.喚醒

int

pthread_cond_siganl

(pthread_cond_t* cond)

int pthread_cond_broadcast (pthread_cond_t*cond)
4.釋放

int pthread_cond_destroy (pthread_cond_t* cond)
結合條件變數實戰一下消費者模型:消費者吃麵,生產者做麵,當碗裡沒麵時,將消費真放進pcb等待佇列,做好後有生產者通知其出隊,當碗裡有麵的時,將生產者放入pcb等待佇列,當碗裡吃完的時候由消費者通知其做麵。

#include

#include

#include

#define threadcount 2

int g_bowl =0;

pthread_mutex_t g_mut;

pthread_cond_t g_cond;

void

*eatstart

(void

* arg)

printf

("i am %p, i eat %d\n"

,pthread_self()

, g_bowl)

; g_bowl--

;pthread_mutex_unlock

(&g_mut)

;pthread_cond_signal

(&g_cond);}

return

null;}

void

*makestart

(void

* arg)

g_bowl++

;printf

("i am %p, i make %d\n"

,pthread_self()

, g_bowl)

;pthread_mutex_unlock

(&g_mut)

;pthread_cond_signal

(&g_cond);}

return

null;}

intmain()

ret =

pthread_create

(&product[i]

,null

, makestart,

null);

if(ret <0)

}for

(int i =

0; i < threadcount; i++

)pthread_mutex_destroy

(&g_mut)

;pthread_cond_destroy

(&g_cond)

;return0;

}

Linux下執行緒

此文講述的執行緒為linux下,其執行緒庫函式是由posix標準定義的,稱為posix thread或者pthread。在linux上線程函式位於libpthread共享庫中,因此在編譯時要加上 lpthread選項。建立執行緒 終止執行緒 等待執行緒 三個函式都為pthread.h中定義,其中要注...

Linux下執行緒實現

1.執行緒概述 程序是系統中程式執行和資源分配的基本單位。每個程序有自己的資料段 段和堆疊段。執行緒通常叫做輕型的程序。執行緒是在共享記憶體空間中併發執行的多道執行路徑,他們共享乙個程序的資源。因為執行緒和程序比起來很小,所以相對來說,執行緒花費更少的cpu資源。2.執行緒建立和退出 在linux中...

Linux下執行緒的操作

01 7 27 上午 10 39 13 介紹在linux下執行緒的建立和基本的使用。linux下的執行緒是乙個非常複雜的問題,由於我對執行緒的學習不時很好,我在這裡只是簡單的介紹執行緒的建立和基本的使用,關於執行緒的高階使用 如執行緒的屬性,執行緒的互斥,執行緒的同步等等問題 可以參考我後面給出的資...