【发布时间】:2012-08-19 15:38:17
【问题描述】:
我正在学习线程同步,这是一个演示如何在线程执行时锁定关键数据:
http://ideone.com/7Do0l
(要运行此代码,请在 Linux/MacOS 环境下使用-pthread 参数编译它)
程序按预期运行,但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) 导致一个线程在调用另一个线程之前重复执行很长时间。
有没有办法解决这个问题?
更新
有一个技巧可以让程序产生结果:为每个线程随机生成睡眠时间,但这并不一致,因为两个随机数可能偶然相同。
【问题讨论】:
-
您到底想完成什么?您期望的行为是什么?
-
应该是:
Thread #1 is doing math. 1 + 1 = 2.(然后 1 秒后:)Thread #2 is doing math. 2 + 1 = 3.(等等) -
只有我一个人注意到这里的人们将 1 毫秒称为 1 秒,而答案将 100 毫秒以下称为 1 秒。
-
不要调用信号量互斥体。
-
@Abhineet Linux 中的
sleep()函数以秒为单位,而Windows 中等效的Sleep()(大写S)以毫秒为单位。
标签: c multithreading pthreads