所以,我需要一些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
}
}
我将在程序顶部定义的静态整数producerseed和consumerseed作为全局变量。我是这样做的,因为我认为对rand_r的调用需要访问一个静态的,不变的内存位置。
这是正确的方法吗?或者我是否需要每个线程的不同的整数。这会导致我的线程中出现任何竞争条件吗?生成的随机数怎么样 - 每次都会有所不同?
编辑1:好的,所以问题的答案基本上是不正确。每个线程都需要唯一种子整数。这可以来自,例如,time()或p_thread_self()id。我仍然对如何准确实现这一点感到困惑,但我会继续努力并报告。现在我决定使用p_thread_self作为每个线程的种子。
非常感谢您花时间寻找/回答。
答案 0 :(得分:4)
在C ++ 11中,您可以使用std::random_device
在每个线程上创建另一个独立种子。这与您在单线程代码中完全相同。然后,您可以在thread::sleep()
上致电std::this_thread
。
#include <random>
#include <thread>
#include <chrono>
thread_local std::random_device rd; // used once only per thread to initialise RNG
thread_local std::mt19937 rng(rd()); // thread-specific RNG
std::uniform_int_distribution<int> uni(0,800); // guaranteed unbiased
// called possibly many times
std::this_thread::sleep_for(uni(rng)*std::chrono::microseconds);
特别是,不需要(ab)将当前时间用作种子和/或其他相关种子。
答案 1 :(得分:1)
time()
以获取第一个种子。然后,对于每个新线程,将一个添加到当前种子以获取下一个种子。例如,如果time()
返回100,那么您的种子将是100,101,102等。您的主线程需要将种子传递给每个线程作为线程参数的一部分。编辑:
100
)并将其与线程ID混合(使用xor或add)。这样你就不必将种子传递给每个线程。至于仅使用线程ID作为种子,这也可以。但是,在新的运行中,您可能会获得与先前运行相同的线程ID(取决于您的操作系统如何确定线程ID)。因此,如果您不想依赖于操作系统如何生成线程ID,您仍应使用一些初始种子,例如时间。答案 2 :(得分:0)
我的困惑源于如果我想要一个不同的整数 用于每个线程的rand_r,然后我该怎么做?我怎么能够 如果我有一个不同的(即随机)整数用于每个线程 不能创建随机整数?
这里需要使用特定于线程的变量。所以你可以使用这些方法。
pthread_setspecific() & pthread_getspecific()
这用于创建全局变量,但仍然特定于每个线程(不共享):它们是特定于线程的全局变量。
的好例子