unix多執行緒,互斥鎖和訊號燈的應用

2021-04-22 18:23:26 字數 1424 閱讀 5448

#include

#include

#include

#include

#include

#include

#include

using namespace std;

static sem_t my_sem;

static bool done_flag = false;

class data

~data()

void add_at_tail(const string &s)

const string& get_at_head()

void del_at_head()

bool is_empty()

int get_size()

void set_def_size(int n)

int get_def_size()

public:

pthread_mutex_t v_mutex;

private:

queueq_string;

int size;

};void* product(void *data)

while (p_data->get_size() <= p_data->get_def_size());

done_flag = true;

sem_post(&my_sem);

cout << endl << "ok!" << endl;

return null;

}void* consume(void *data)

sem_getvalue(&my_sem, &sem_value);

if ((done_flag == true) && (sem_value <= 0))

break;

pthread_mutex_lock(&(p_data->v_mutex));

cout << "consume " << p_data->get_at_head() << endl;

p_data->del_at_head();

pthread_mutex_unlock(&(p_data->v_mutex));

} while(p_data->is_empty() == false);

return null;

}int main(void)

// sleep(2);

v_pthread_consume_id = pthread_create(&v_pthread_consume, null, consume, (void*)&data);

for (int j = 0; j < 2; j++)

pthread_join(v_pthread_consume, null);

sem_destroy(&my_sem);

return 0;

}

Posix多執行緒程式設計學習筆記(三) 訊號燈(1)

posix 有名訊號燈 函式sem open 建立乙個新的有名訊號燈或開啟乙個已存在的有名訊號燈。有名訊號燈總是既可用於執行緒間的同步,又可以用於程序間的同步。1.posix 有名訊號燈函式 1.名稱 sem open 功能 建立並初始化有名訊號燈 標頭檔案 include 函式原形 sem t s...

多執行緒 互斥物件和鎖

互斥物件的主要操作有兩個,即加鎖 lock 和解鎖 unlock 當乙個執行緒對互斥物件進行lock操作並成功獲得這個互斥物件的所有權,在此執行緒對此物件unlock前,其他執行緒對這個互斥物件的lock操作都會被阻塞。有些傾向需要對多個互斥物件進行加鎖,考慮下面的 std mutex mt1,mt...

多執行緒 關於訊號量和互斥鎖的比喻

這陣子學習多執行緒方面的知識發現自己對於一些基本概念都還不清楚。比如訊號量和互斥鎖這塊。看網上的資料越看越亂。偶然看到一篇對訊號量和互斥鎖的形象比喻,拷貝下來供自己學習學習。這個比喻是解釋訊號量 semaphore 和互斥鎖 mutex 的區別。該比喻最初來自這裡,我先翻譯一下,然後對它做個改進。互...