0

我正在学习线程同步,这是演示如何在线程执行时锁定关键数据:

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) 导致一个线程在另一个线程被调用之前被重复执行很长时间。

有没有办法解决这个问题?

更新

有一个技巧可以让程序产生结果:为每个线程随机生成睡眠时间,但这并不一致,因为两个随机数可能偶然相同。

4

3 回答 3

0

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);
}
于 2012-08-24T04:42:10.650 回答
0

这并不是线程旨在解决的真正问题。您必须为每个线程有一个单独的信号量,让一个线程循环通过这些信号量,每秒在不同的信号量上调用 sem_post,其余的只调用 sem_wait。也可以只使用一个线程。

于 2012-08-24T05:03:02.717 回答
0

我做了一些研究,发现产生所需输出的唯一方法是我在更新部分提到的方法。也就是说,不用硬编码睡眠定时器,只需给每个线程一个随机数:

    // Sleep time in microseconds.
    int st = rand() % 500000;
    usleep(st);

实际上,我一直在担心两个线程同时做同样的事情。即使两个相邻的随机计时器可能意外相同,两个线程也不会同时在 CPU 的同一个内核上执行,如果 CPU 是多个内核,则没有两条指令可以同时修改相同的内存内容。

于 2012-08-24T08:01:39.427 回答