2015-04-04 79 views
0

我正在嘗試編寫一個使用3個線程和共享內存的程序。共享內存是一個有101個值的數組。第一個值共享內存[0](初始化爲0)是狀態值,它決定了哪個操作應該發生。三個線程都做多線程程序中的段錯誤

  1. 第一個應該用100個隨機值填充共享內存數組。並將狀態值設置爲1.

  2. 第二個應打印100個隨機值(從索引1到100)的乘積。並將狀態值設置爲2.第三個應打印100個隨機變量的平均值。

  3. 第三個應打印100個隨機變量的平均值。並將狀態值設置爲0.以便線程1用不同的隨機變量填充共享內存。

這是我的代碼

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 
#include <pthread.h> 

unsigned int product=0; 
float avg=0; 
int* shared_memory; 
int status=0; 

void productAllThread(); 
void averageAllThread(); 
void *parentProcess(); 
void *prodAll(); 
void *avgAll(); 
void initializeArray(); 

int main(int argc, const char * argv[]) 
{ 

    time_t t; 
    key_t key = 9876; 

    // Create shared memory area 
    int shm_id = shmget(key, sizeof(int)*101, IPC_CREAT | 0666); 

    // initialize the random variable 
    srand((unsigned) time(&t)); 

    // Create shared memory 
    shared_memory=shmat(shm_id, NULL, 0); 

    //create threads 
    pthread_t tid1, tid2, tid3; 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 

    pthread_create(&tid1, &attr, parentProcess, NULL); 
    pthread_create(&tid2, &attr, prodAll, NULL); 
    pthread_create(&tid3, &attr, avgAll, NULL); 

    pthread_join(tid1, NULL); 
    pthread_join(tid2, NULL); 
    pthread_join(tid3, NULL); 


    return 0; 
} 

void initializeArray() { 
    shared_memory[0]=0; 
    status=shared_memory[0]; 
    int i= 0; 
    printf("Initial Array:{"); 
    for(i=1; i<100; i++) 
    { 
     shared_memory[i]=rand()% 50; 
     printf("%d,", shared_memory[i]); 
    } 
    printf("}\n"); 
} 

void *parentProcess() 
{ 
    while(1) 
    { 
     status=shared_memory[0]; 
     if(status==0) { 
      // initialize array 
      initializeArray(); 
      shared_memory[0]=1; 
     } else { 
      sleep(10); 
     } 
    } 
} 

void averageAllThread() { 
    while(1) { 
     status=shared_memory[0]; 
     if(status==2) 
     { 
      avgAll(); 
      wait(NULL); 
      printf("Avg:%.2f\n", avg); 
      shared_memory[0]=0; 
     } else { 
      sleep(5); 
     } 
    } 
} 
void productAllThread() { 
    while(1){ 
     status=shared_memory[10]; 
     if (status==1) 
     { 
      prodAll(); 
      wait(NULL); 
      printf("Sum:%d\n",product); 
      shared_memory[0]=2; 
     } else { 
      sleep(5); 
     } 

    } 
} 

void *prodAll() 
{ 
    while(1){ 
     int i=1; 
     product=0; 
     for(i=1; i<100; i++) 
     { 
      product=product+shared_memory[i]; 
     } 
    } 
} 

void *avgAll() 
{ 
    while(1){ 
     int i=0; 
     avg=0; 
     for(i=1; i<100; i++) 
     { 
      avg=avg+shared_memory[i]; 
     } 
     avg=avg/100; 
    } 
} 

當我在終端運行它,它給了我這個錯誤

「段錯誤:11」

什麼可能導致這種類型的的錯誤?如果這個錯誤得到解決,程序能夠正常工作來完成我想要做的工作嗎?

+0

'pthread_t tid1'未初始化 – baf 2015-04-04 08:55:56

+0

初始化更正。但我仍然有同樣的問題 – 2015-04-04 09:01:53

+0

你有四個線程,順便說一句。 – 2015-04-04 09:05:33

回答

0

我發現在你的程序了幾個問題:

  1. 您所呼叫的錯功能,啓動線程:

    pthread_create(&tid1, &attr, parentProcess, NULL); 
    pthread_create(&tid2, &attr, prodAll, NULL); 
    pthread_create(&tid3, &attr, avgAll, NULL); 
    

    應該是:

    pthread_create(&tid1, &attr, parentProcess, NULL); 
    pthread_create(&tid2, &attr, productAllThread, NULL); 
    pthread_create(&tid3, &attr, averageAllThread, NULL); 
    
  2. 你有幾個電話wait()像這樣:

    wait(NULL); 
    

    您應該刪除所有這些。

  3. 應刪除avgAll()prodAll()中的while循環,因爲這些函數的調用者中已經存在while循環。

  4. 電話srand()應該從parentProcess()作出,否則它可能不會影響該線程中的rand()調用。