[英]Simple Multi-threading Stack Implementation using Conditional Variables
在我們的CS課程中,我們使用POSIX線程編程來實現簡單的堆棧數據結構。 因此,我們使用了pthread_cond_wait
和pthread_cond_signal
:
pthread_mutex_t write_mutex;
pthread_mutex_t read_mutex;
pthread_cond_t write_cond;
pthread_cond_t read_cond;
int read()
{
pthread_mutex_lock(&read_mutex);
while(is_empty())
{
pthred_cond_wait(&read_cond, &read_mutex);
}
// read value [...]
pthread_cond_signal(&write_cond);
pthread_mutex_unlock(&read_mutex);
return read_value;
}
寫函數的實現類似,但鎖定write_mutex
信號read_cond
。
問:我的實現問題是:由於信號的緣故,這在閱讀文章與寫作之間是否不需要1:1的比例嗎? 由於每次寫入都需要在讀取功能中觸發一個信號(因此多次讀取),因此此實現方法不允許寫入多個項目而之間不進行任何讀取。
我的理解正確嗎?還是我缺少什么?
Q2調用pthread_cond_signal(...)
后信號“有效”多長時間?
問 :我的實現問題是:由於信號的緣故,這在閱讀文章與寫作之間是否不需要1:1的比例嗎? 由於每次寫入都需要在讀取功能中觸發一個信號(因此多次讀取),因此此實現方法不允許寫入多個項目而之間不進行任何讀取。
如果write()
函數確實類似於所示的read()
函數,則為是和否。 我認為您是在建議堆棧永遠不能只有一個以上的元素,但事實並非如此。 請注意,進入您的read()
函數並查找非空堆棧的線程將如何完全繞過條件變量的等待。 如果堆棧為空,則線程僅等待讀取。 另一方面,類似的情況是線程僅在堆棧已滿時才等待寫入。
Q2調用pthread_cond_signal(...)后信號“有效”多長時間?
根本沒有時間。 發出CV信號時,只有已經等待條件變量的線程才能被解除阻塞。 此后,即使沒有線程被阻塞,也沒有任何已接收信號的存儲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.