2012-04-26 60 views
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); 
    } 

回答

2

当你睡你锁定互斥之前,那么你执行的其他线程”重新给其他线程足够的时间来改变共享变量的值。这就是为什么你在位置#1看到“睡眠”的值为“10”。

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

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

2

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

但我会给你一个提示:只有位置1的sleep()重要;锁内的另一个不相关,只要它不改变锁外的代码。