0

在多线程上编写我的基本程序,我遇到了几个困难。

在下面的程序中,如果我在位置 1 休眠,则打印的共享数据的值始终为 10,而在位置 2 保持休眠,共享数据的值始终为 0。

为什么会出现这种输出?如何决定我们应该在哪个地方睡觉。这是否意味着如果我们在互斥锁中放置一个睡眠,那么另一个线程根本不会被执行,因此共享数据为 0。

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include<unistd.h>

    pthread_mutex_t lock;

    int shared_data = 0;

    void * function(void *arg)
    {
        int i ;
        for(i =0; i < 10; i++)
        {
            pthread_mutex_lock(&lock);
            shared_data++;
            pthread_mutex_unlock(&lock);
        }

        pthread_exit(NULL); 
    }


    int main()
    {
        pthread_t thread;
        void * exit_status;
        int i;

        pthread_mutex_init(&lock, NULL);

        i = pthread_create(&thread, NULL, function, NULL);

        for(i =0; i < 10; i++)
        {
            sleep(1);      //POSITION 1
            pthread_mutex_lock(&lock);
            //sleep(1);    //POSITION 2
            printf("Shared data value is %d\n", shared_data);
            pthread_mutex_unlock(&lock);
        }

        pthread_join(thread, &exit_status);

        pthread_mutex_destroy(&lock);
    }
4

2 回答 2

2

当您在锁定互斥锁之前休眠时,您将给另一个线程足够的时间来更改共享变量的值。这就是为什么您在位置#1 中看到“sleep”的值为“10”。

当您首先获取互斥锁时,您可以足够快地锁定它,以便在其他线程有机会修改它之前打印出该值。另一个线程坐下来阻塞pthread_mutex_lock()调用,直到你的主线程完成睡眠并解锁它。那时,第二个线程终于开始运行并更改值。这就是为什么您在位置#2 处看到“睡眠”的值为“0”的原因。

这是竞态条件的经典案例。sleep在不同的机器上,相同的代码可能不会在位置#2的调用中显示“0” 。在您的主线程锁定互斥锁之前,第二个线程完全有可能有机会更改变量的值一次或两次。互斥锁可以确保两个线程不会同时访问同一个变量,但它无法控制两个线程访问它的顺序。

于 2012-04-26T23:32:42.140 回答
2

我在这里有一个完整的解释,但最终删除了它。这是一个基本的同步问题,您应该能够在处理任何更复杂的问题之前对其进行跟踪和识别。

但我会给你一个提示:只有sleep()在位置 1 才重要;锁内的另一个无关紧要,只要它不更改锁外的代码即可。

于 2012-04-26T23:33:03.467 回答