我正在学习线程同步,这是演示如何在线程执行时锁定关键数据:
http://ideone.com/7Do0l-pthread
(要运行此代码,请在 Linux/MacOS 环境
下使用参数编译它)
该程序按预期工作,但该sleep()
函数不会暂停线程之间的执行。我的想法是让一个线程一次进行计算,然后 1 秒后另一个线程开始发挥作用。这是我正在使用的代码段:
while(1) {
//sleep(1); //(1) (Sleep for one second)
sem_wait(&mutex);
//sleep(1); //(2)
printf("Thread #%d is doing math. %d + 1 = %d.\n", (int) id, s, s+1);
s++;
//sleep(1); //(3)
sem_post(&mutex);
//sleep(1); //(4)
}
我尝试了四个位置sleep()
。(1)和(4)导致单个线程之间没有暂停,而是在两束十个线程之间。(2) 和 (3) 导致一个线程在另一个线程被调用之前被重复执行很长时间。
有没有办法解决这个问题?
更新
有一个技巧可以让程序产生结果:为每个线程随机生成睡眠时间,但这并不一致,因为两个随机数可能偶然相同。