在线程和进程中使用通用容器

时间:2018-11-02 16:06:17

标签: multithreading process

#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个新进程。   每个线程或每个进程将公共变量增加M倍。参数N和M作为命令行参数提供。   主程序(即主线程/进程)首先将变量A的初始值设置为零,然后创建默认的线程/进程数,并且当所有线程/进程完成时,将打印变量A的最终值。”


我已经编写了用于创建N个线程的第一个程序,但是在编写用于创建N个进程的第二个程序时遇到了一些问题(上面的一个)。该任务表明两个程序的变量A必须相同。。我对此的解释是,我必须在第一个程序中将变量A声明为全局变量,然后在第二个程序中以相同的方式声明它,但在声明中添加修饰符“ extern”。编译第二个程序时出现的错误是:


在功能proces': procesi.c:(.text+0x25): undefined reference to A'中 procesi.c :(。text + 0x30):对A' /tmp/cc2mFZ94.o: In function main'的未定义引用: procesi.c :(。text + 0x70):对A' procesi.c:(.text+0x124): undefined reference to A'的未定义引用 collect2:错误:ld返回1退出状态

0 个答案:

没有答案