Использование общего контейнера с потоками и процессами - PullRequest
0 голосов
/ 02 ноября 2018
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>

extern int A;
int SHMID;
int *a;
void proces(int i, int increase){
    a[i] = i;
    A+=increase;
}

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

    int N, M, i;
    N=atoi(argv[0]);    
    M=atoi(argv[1]);
    A = 0;
    SHMID = shmget(IPC_PRIVATE, sizeof(int)*N, 0600);

    if(SHMID == -1){
        exit(1);    
    }

    a = (int *)shmat(SHMID, NULL, 0);

    for(i=0; i<N; i++){
        if(fork() == 0){
            proces(i, M);
            exit(0);        
        }
    }   

    for(i=0; i<N; i++)
        wait(NULL);         

    printf("A = %d\n", A);

    shmdt((char *)a);
    shmctl(SHMID, IPC_RMID, NULL);

    return 0;
}

Задача такова: «Написать две программы - одну, которая создает N новых потоков, и другую, которая создает N новых процессов. Каждый поток или каждый процесс увеличивает общую переменную A M раз. Параметры N и M задаются в качестве аргумента из командной строки. Основная программа, то есть основной поток / процесс, сначала устанавливает нулевое начальное значение переменной A, затем создает число потоков / процессов по умолчанию, а после завершения всех потоков / процессов выводится окончательное значение переменной A ".


Я уже написал первую программу для создания N потоков, но у меня возникли проблемы с кодированием второй программы для создания N процессов (описанной выше). Задача гласит, что переменная A должна быть общей для обеих программ . Моя интерпретация заключается в том, что я должен объявить переменную A в первой программе как глобальную переменную, а затем объявить ее так же во второй программе, но с добавлением модификатора extern в объявлении. Ошибка, которую я получаю при компиляции второй программы:


В функции proces': procesi.c:(.text+0x25): undefined reference to A ' processi.c :(. text + 0x30): неопределенная ссылка на A' /tmp/cc2mFZ94.o: In function main ': processi.c :(. text + 0x70): неопределенная ссылка на A' procesi.c:(.text+0x124): undefined reference to A ' collect2: ошибка: ld вернул 1 статус выхода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...