執行緒同步小練 執行緒互斥鎖

2021-06-18 10:29:17 字數 1460 閱讀 7816

很久沒有寫應用層的程式了,今天幫同學的忙。寫了乙個關於生產者與消費者的問題。具體的需求如下:

用posix介面實現乙個可以執行的變種生產者消費者問題:

生產者可以無限生產,無需關心消費者是否取走

消費者只能消費生產者生產出來的商品

注意迴繞問題,提出解決方案

附上源**:

#include 

#include

#include

#include

#define buff_size 20

sem_t full; /* keep track of the number of full spots */

sem_t empty;

pthread_mutex_t mutex1 = pthread_mutex_initializer;

int value[buff_size] = ;

int item_c = 0;

int item_p = 0;

void *producer(void *arg)

//p < c, 消費者還沒有消費,生產者休眠。

if (item_p == item_c) else

pthread_mutex_unlock(&mutex1);

sleep(1);}}

void *consumer(void *arg)

pthread_mutex_lock(&mutex1);

myv = value[item_c % buff_size];

printf("consumer run, %d\n", myv);

item_c++;

if (item_c > buff_size)

pthread_mutex_unlock(&mutex1);

//p > c , c追上了p,生產者沒有生產的了,消費者需要休眠,同時喚醒生產者生產

if (item_c == item_p)

sleep(4);}}

int main()

總結一下:

其中還是遇到了一些問題,還是看出來自己在應用層的功力尚淺啊。需要努力。

其一——執行緒同步的問題:

目地:確保不同的執行緒訪問共享的儲存內容的時候不會訪問到無效的數值。這個時候就需要對執行緒進行同步。

具體的方式:

第一步:定義乙個全域性的互斥量pthread_mutex_t mutex_1 = pthread_mutex_initializer;(也可以動態定義pthread_mutex_init(mutex_1, null);

第二步:加鎖或者解鎖:

pthread_mutex_lock(&mutex_p);

pthread_mutex_unlock(&mutex_p);

其二——多個鎖的時候,為了防止死鎖。

如果多個鎖,是沒有相互關係的,那麼在加鎖之前應該處於前乙個鎖解鎖之後,不然會出現死鎖。

執行緒同步 互斥鎖

一 為什麼要用多執行緒?避免阻塞 乙個程序如果只有乙個執行緒的話,當這個乙個執行緒阻塞則就整個程序阻塞,無法再去完成其他事情。提高效率,避免cpu空 程式經常涉及讀寫操作就會訪問磁碟,這些操作的速度比cpu慢的多,而為了等待這些操作的響應,cpu又不能去幹其他的事情或者處理新的請求,導致這種單執行緒...

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...

執行緒同步與互斥 互斥鎖

在多工作業系統中,同時執行的多個任務可能都需要使用同一種資源。這個過程有點類似於,公司部門裡,我在使用著印表機列印東西的同時 還沒有列印完 別人剛好也在此刻使用印表機列印東西,如果不做任何處理的話,列印出來的東西肯定是錯亂的。下面我們用程式模擬一下這個過程,執行緒一需要列印 hello 執行緒二需要...