我正在尝试编写一个使用共享内存的3个线程的程序。共享存储器是一个具有101个值的数组。共享内存[0](初始化为0)的第一个值是状态值,它决定应该进行哪个操作。三个线程执行
-
第一个应该用100个随机值填充共享存储器阵列。并将状态值设置为1。
-
第二个应该打印100个随机值的乘积(从索引1到100)。并将状态值设置为2。
-
第三个应该打印100个随机变量的平均值。并将状态值设置为0。使得线程一用不同的随机变量填充共享存储器。
这是我的代码
#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:%.2fn", avg);
shared_memory[0]=0;
} else {
sleep(5);
}
}
}
void productAllThread() {
while(1){
status=shared_memory[10];
if (status==1)
{
prodAll();
wait(NULL);
printf("Sum:%dn",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_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);
-
您对
wait()
的一些调用如下:wait(NULL);
你应该把它们全部删除。
-
avgAll()
和prodAll()
中的while循环应该删除,因为这些函数的调用方中已经存在while循环。 -
对
srand()
的调用应该从parentProcess()
进行,否则它可能不会影响该线程中的rand()
调用。