所以,我需要一些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