多线程程序中的c分段错误



我正在尝试编写一个使用共享内存的3个线程的程序。共享存储器是一个具有101个值的数组。共享内存[0](初始化为0)的第一个值是状态值,它决定应该进行哪个操作。三个线程执行

  1. 第一个应该用100个随机值填充共享存储器阵列。并将状态值设置为1。

  2. 第二个应该打印100个随机值的乘积(从索引1到100)。并将状态值设置为2。

  3. 第三个应该打印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"

什么可能导致这种类型的错误?如果这个错误被修复了,程序会正常工作吗?

我在您的程序中发现了一些问题:

  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()调用。

相关内容

  • 没有找到相关文章

最新更新