2014-03-03 97 views
1

我正在嘗試編寫一個允許三個線程訪問/修改公共緩衝區的程序。我在全局聲明緩衝區,並在main()函數的開頭調用malloc。然後我通過fork()創建不同的線程。信號量用於確保一次只能訪問/更新緩衝區。我感到困惑的是,其他線程對緩衝區的更改沒有被單一線程所取代。我在每個線程中打印出緩衝區內存的位置,其中所有的線程都是一樣的。不會更新它貫穿所有線程?我在印象線程共享相同的資源/地址空間?線程訪問/更新共享內存位置

#define buf_size 100 
char *buffer; 


int main(int argc, char *argv[]) 
{ 
    sem_t sp; 
    (sem_init(&sp,1,1)); 
buffer= malloc(100); 


    pid_t p2_pid;   // child PID 


    if ((p2_pid = fork()) < 0) 
    { 
     err_sys("fork error (1)"); 
    } 
    else if (p2_pid > 0)  // this is the parent (P1) 
    { 
    int i = 0; 
    sem_wait(&sp); 
     printf("Process 1 accessing buffer\n"); 
    printf("BufAddr: %d\n", (buffer)); 
    for(i=0; i < 50; i++) 
    { 
     if(i%2==0) 
     { 
      buffer[i] = 'c'; 
     } 
     else 
     { 
      buffer[i] = 'j'; 
     } 
     printf("%c",(buffer[i])); 


    } 
    printf("\n"); 
    sem_post(&sp); 
    if (waitpid(p2_pid, NULL, 0) < 0)  // wait for child (P2) 
    { err_sys("waitpid error (1)"); } 

    } 
    else    // this is the child (P2) 
    { 

     pid_t p3_pid;  

     if ((p3_pid = fork()) < 0) 
    { 
     err_sys("fork error (2)"); 
    } 
     else if (p3_pid > 0) 
    { 
     int j = 0; 
     sem_wait(&sp); 
     printf("Process 2 accessing buffer\n"); 
     printf("BufAddr: %d\n", (buffer)); 
     for(j=0; j < 50; j++) 
     { 

      if(buffer[j]=='c') 
      { 
       buffer[j] = 'b'; 
      } 
      else 
      { 
       buffer[j] = 'g'; 
      } 
      printf("%c",(buffer[j])); 
     } 
     printf("\n");   
     sem_post(&sp); 
     if (waitpid(p3_pid, NULL, 0) < 0)  
     { err_sys("waitpid error (2)"); } 
    } 
     else   
    { 
     int k = 0; 
     int bCount = 0; 
     int gCount = 0; 
     sem_wait(&sp); 
     printf("Process 3 accessing buffer\n"); 
     printf("BufAddr: %d\n", (buffer)); 
     for(k=0; k < 50; k++) 
     { 
      if(buffer[k]=='g') 
      { 
       gCount++; 
      } 
      else 
      { 
       bCount++; 
      } 
      printf("%c",(buffer[k])); 
     } 
     sem_post(&sp); 
     printf("bCount = %d\n" , (bCount)); 
     printf("gCount = %d\n" , (gCount));   

    } 
    } 


    return 0; 
} 
+3

你能顯示一些相關的代碼嗎? –

+0

你是否期待我們來你家看代碼? –

+0

很抱歉現在添加它 – Danzo

回答

3

如果你fork(),你不會創建一個新的線程,而是一個新的程序實例。內存區域不在實例之間共享,而是在所有實例中重複。你需要的是pthread_create或類似的。另外,信號量不是互斥線程的正確機制,你真正想要的是一個互斥量。

編輯:這並不是說內存不能在進程之間共享。有共享內存的可能性,但是,malloc()不會返回這樣的內存塊。如果您想在進程間共享內存,請查看mmap的主頁,特別是關於MAP_SHARED的部分。但是,還要注意,您還必須在實例之間共享您的同步原語。每個進程的堆棧中的本地進程不會在實例之間同步任何內容。

+0

數據是不是可以在不同的進程之間通過'static'或'mmap'共享? –

+0

@PauloBu是的,你可以在進程間通過'mmap'共享內存。我會編輯我的答案,但是,OP的編輯清楚地顯示了malloc的用法,這是不共享的 – JustSid

+0

Nevermind,根據提供的代碼這是真的:) –