【发布时间】:2015-06-10 12:36:14
【问题描述】:
所以,我需要一些关于 C++ 中多线程的帮助。我想让我的多个线程使用低于 800 的随机数调用函数 usleep。但是,据我了解,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
}
}
我在程序顶部定义了静态整数生产者种子和消费者种子,作为全局变量。我这样做是因为我认为对 rand_r 的调用需要访问一个静态的、不变的内存位置。
这是正确的方法吗?还是每个线程都需要 不同的 整数。这会导致我的线程中出现任何竞争条件吗?生成的随机数呢——会不会每次都不一样?
编辑 1: 好的,所以这个问题的答案基本上是它不正确。每个线程都需要一个 唯一 种子整数。例如,这可以来自 time() 或 p_thread_self() id。我仍然对如何准确实现这一点感到困惑,但我会继续努力并报告。现在我决定使用 p_thread_self 作为每个线程的种子。
非常感谢您花时间查看/回答。
【问题讨论】:
标签: c++ c multithreading random