0
我正在嘗試編寫一個使用3個線程和共享內存的程序。共享內存是一個有101個值的數組。第一個值共享內存[0](初始化爲0)是狀態值,它決定了哪個操作應該發生。三個線程都做多線程程序中的段錯誤
第一個應該用100個隨機值填充共享內存數組。並將狀態值設置爲1.
第二個應打印100個隨機值(從索引1到100)的乘積。並將狀態值設置爲2.第三個應打印100個隨機變量的平均值。
第三個應打印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」
什麼可能導致這種類型的的錯誤?如果這個錯誤得到解決,程序能夠正常工作來完成我想要做的工作嗎?
'pthread_t tid1'未初始化 – baf 2015-04-04 08:55:56
初始化更正。但我仍然有同樣的問題 – 2015-04-04 09:01:53
你有四個線程,順便說一句。 – 2015-04-04 09:05:33