我正在学习线程同步,这是演示如何在线程执行时锁定关键数据的演示:
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)导致一个线程在另一个线程被调用之前被反复执行很长时间。
这是否有补救措施?
更新
有一个技巧可以让程序产生结果:为每个线程随机生成睡眠时间,但由于偶然两个随机数可能相同,因此不一致。
答案 0 :(得分:0)
将其置于第3位,因为您需要在printf
条消息之间延迟一秒。
如果要确保在任何线程进入关键部分之前初始化所有线程,请将链接代码的main
功能修改为
int main() {
pthread_t thread[10];
int i;
sem_init(&mutex, 0, 1);
sem_wait(&mutex);
for (i = 0; i<10; ++i)
pthread_create(&(thread[i]), NULL, job, (void*) i);
sem_post(&mutex);
sleep(100);
}
答案 1 :(得分:0)
这不是线程旨在解决的问题。你必须为每个线程都有一个单独的信号量,让一个线程循环遍历那些,每秒调用另一个sem_post,其余的只调用sem_wait。也可以只使用一个线程。
答案 2 :(得分:0)
我做了一些研究,发现生成所需输出的唯一方法是我在更新部分中提到的那个。也就是说,不是硬编码睡眠定时器,只需给每个线程一个随机数:
// Sleep time in microseconds.
int st = rand() % 500000;
usleep(st);
实际上我一直在担心两个线程同时做同样的事情。即使两个相邻的随机定时器可能意外相同,但两个线程永远不会同时在CPU的同一内核上执行,如果CPU是多个内核,则没有两个指令可以同时修改相同的内存内容。