2011-07-20 53 views
0
  #include<pthread.h> 
      #include<stdio.h> 
      #include<semaphore.h> 
       void func(); 
       int a; 
       int main() 
       { 

       pthread_t thread1; 
       sem_t semaphore1; 
       sem_init(&semaphore1,0,1); 
       pthread_create(&thread1,NULL,(void *)func,NULL); 
       sem_wait (&semaphore1); 
       a=62; 
       printf("%d",a); \\ as i found on google 
       sleep(2); \\ i believe a value should be sticked to 62 
       sleep(1); \\ but output shows different why? 
       printf("%d",a); 
       sem_post(&semaphore1); 
       } 
      void func() 
      { 
       a=45; 
       sleep(1); 
       a=32; 
       a=75; 
      printf("hello"); 
      } 

當我谷歌搜索到它時,我發現sem_wait鎖定了全局變量,所以沒有其他線程訪問這個變量。我的代碼出了什麼問題?當使用信號量時,全局變量值發生了變化

但是,當我嘗試了這些代碼的輸出是

  62 
      hello 
      75. 

的價值得到了改變,但注意,輸出(「%d」,a)是sem_wait下,什麼錯我的代碼?

回答

2

信號燈只提供諮詢鎖定。他們不知道變量等,他們鎖定您的代碼的區域。他們不執行任何操作,因此您必須自己撥打waitpost

這是什麼wait和帖子真正的意思,當你的例子中使用。

sem_wait (&semaphore1); /* AKA "may I enter this region" */ 

sem_post(&semaphore1); /* AKA "I am done with this region. */ 

我看到它的方式,main在進入之前請求許可。 func在修改a之前未要求獲得許可。

因此func應該waitpost

void func() 
{ 
    sem_wait (&semaphore1); 
    a=45; 
    sleep(1); 
    a=32; 
    a=75; 
    printf("hello"); 
    sem_post (&semaphore1); 
} 

當然,對於這個sempahore1應該是全局可訪問的。

+0

你的意思是互斥體的選項是什麼? – niko

+0

@niko事實上,你正在像一個互斥體一樣使用信號量。但這不是問題:) – cnicutar

+0

它的lock()概念類似於C# –

相關問題