c语言rand_r多线程慢,在C/C++中使用rand_r进行多线程程序的正确方法

博客讨论了在C语言中使用多线程时如何确保每个线程使用不同的随机数种子来调用usleep函数。作者指出,rand_r函数需要静态不变的种子,但每个线程需要独特的种子以避免重复。解决方案是使用如time()或pthread_self()为每个线程生成唯一种子,以实现线程间的随机数独立。文章还提到使用p_thread_self作为种子的决定,并表达了对实现细节的困惑。
摘要由CSDN通过智能技术生成

所以,我需要一些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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值