程序空間中有乙個儲存量a,該程序空間內存在多個執行緒,這多個執行緒都會訪問到a,或讀或寫,為了保障每個執行緒當前讀到的是正確的a而不是別的執行緒正在修改過程中的a,我們在訪問a之前需要對a進行加鎖,使得我們在訪問a的時候別的執行緒禁止訪問a,這是互斥量鎖。或者允許多個執行緒同時讀a,這是讀寫鎖。還有一種情況,有些執行緒也需要訪問a,但是它只是想在a達到某個值的時候才做一些事情,即值關心達到某種狀態下的a。比如執行緒1對a+1,執行緒2對a+1,執行緒3是檢查a是否到達10才做一些操作。如果按照互斥量的方法,**應該如下:
void *task1(void *arg)
}void *task1(void *arg)
}void *task3(void *arg)
else
pthread_mutex_unlock(&mutex);
}}
void *task1(void *arg)
}void *task1(void *arg)
}void *task3(void *arg)
/*do work*/
pthread_mutex_unlock(&mutex);
}}
這裡執行緒3呼叫pthread_cond_wait函式來等待被喚醒,此函式會對a解鎖並且進入阻塞。
下面是乙個完整的測試程式:
#include #include #include "error.c"
int count = 0;
pthread_mutex_t mutex1;
pthread_t tid1, tid2, tid3, tid4;
pthread_cond_t condcount;
void *task1(void *arg)
pthread_exit((void*)1);
}void *task2(void *arg)
pthread_exit((void*)2);
}void *task3(void *arg)
pthread_exit((void*)3);
}void *task4(void *arg)
printf("count = %d\n", count);
pthread_cancel(tid1);
pthread_cancel(tid2);
pthread_cancel(tid3);
pthread_mutex_unlock(&mutex1);
pthread_exit((void*)4);
} pthread_exit((void*)4);
}void main()
這裡解釋一下,每個執行緒處理函式裡面加上sleep的原因是,執行緒併發執行,每個執行緒分配的時間片內執行while的話會迴圈非常多此,這會導致結果太長不明顯。
執行緒同步之條件變數
1.條件變數是鎖嗎?不是鎖,但是條件變數能夠阻塞執行緒 條件變數需要和互斥鎖一起使用 互斥量 保護一塊共享資料 條件變數 引起阻塞 2.條件變數的兩個動作?當條件滿足,通知阻塞的執行緒執行緒開始工作 條件不滿足,阻塞執行緒 3.條件變數的型別 pthread cond t 4.主要函式 初始化乙個條...
執行緒同步之條件變數
條件變數不是鎖 名字上就沒有鎖字。但可以造成執行緒阻塞,通常與互斥鎖配合使用。1 條件變數 pthread cond t cond 2 函式 以下函式返回值均是成功返回0,失敗返回錯誤號 1 pthread cond init 動態初始化,配合phtread cond destroy一起使用。或者用...
Linux執行緒同步之條件變數
與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...