如何在线程之间暂停执行?

时间:2012-08-24 04:32:52

标签: c multithreading pthreads

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

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

这是否有补救措施?

更新

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

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是多个内核,则没有两个指令可以同时修改相同的内存内容。