所以,我需要一些C++多線程幫助。我想讓我的多個線程使用低於800的隨機數調用usleep函數。但是,從我的理解中,rand_r必須在每個線程中使用不同的整數。在C/C++中使用rand_r進行多線程程序的正確方法
My confusion源於這樣一個事實,如果我想爲每個線程使用不同的整數用於rand_r,那麼我該怎麼做?如果我不能創建隨機整數,如何爲每個線程使用不同的(即隨機)整數?
static unsigned int consumerseed = 1;
static unsigned int producerseed = 54321;
//producer thread:
void *producer(void *param) {
buffer_item rand;
while (1) {
//sleep for a random period of time:
int producersleeptime = rand_r(&producerseed)%500+100;
usleep(producersleeptime);
//produce an item:
//wait on both semaphores
//attempt to insert into buffer
//signal both semaphores
}
}
//consumer thread:
void *consumer(void *param) {
buffer_item rand;
while (1) {
//sleep for a random period of time:
int consumersleeptime = rand_r(&consumerseed)%600+200;
usleep(consumersleeptime);
//wait on both semaphores
//attempt to remove an item from buffer
//signal both semaphores
}
}
我有靜態整數producerseed,並在程序的頂部consumerseed定義爲全局變量。我這樣做是因爲我認爲對rand_r的調用需要訪問一個靜態的,不變的內存位置。
這是正確的方法嗎?或者我需要不同的整數爲每個線程。這將導致我的線程中的任何競爭條件?生成的隨機數怎麼樣 - 每次都會有所不同?
編輯1:好的,所以這個問題的答案基本上是不正確。每個線程需要一個獨特的種子整數。這可以來自例如time()或p_thread_self()id。我仍然對如何正確實施這個問題感到困惑,但我會努力並報告。現在我決定使用p_thread_self作爲每個線程的種子。
非常感謝您花時間查看/回答。
#2的另一個選項是將thread-id(從「pthread_self」或等價物獲得)混合到基於時間的種子中。這消除了中心線程創建者需要知道種子的需要。 – user4815162342 2015-04-06 11:25:32
使用thread_id作爲每個線程的種子怎麼樣?我想這會爲每個線程創建一個獨特的,大致隨機的種子。我沒有使用時間。這是我現在所做的,但我還沒有測試過。 – Musicode 2015-04-06 18:02:36
@ Musiccode看我的編輯。你說什麼會奏效。它不如一時混合那麼安全,因爲你無法確定操作系統要分配給你的線程ID。 – JS1 2015-04-06 18:07:07