全局变量不保留其在线程中的值

时间:2012-12-30 16:12:46

标签: c multithreading fork

我创建了一个多线程服务器,它有一个指向链表的全局指针,在线程中我试图插入一些数据,但是那个数据(我插入的)没有保留,是否有可能在线程中表示全局值不保留。我使用以下代码(这是最简单的版本。)

struct node {
  int cn; //

  struct node *next;
};




/*GLOBAL VARIABLES*/
struct node *start; //Global pointer to Linked List
/* END */

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

    start = (struct node *)malloc(sizeof(struct node));
    start -> cn =0;

    int pid;
    /* Declaration of Server goes here */
    printf("Server Running ...\n");
    while (1) {

        /* accepting socket*/

        pid = fork();
        if (pid < 0)
            error("ERROR on fork");
        if (pid == 0)  {
            close(serverSocket);
            dostuff(childSocket,start);
            exit(0);
        }
        else
            close(childSocket);

    }
    return 0;
}

void dostuff (int sock, struct node *pointer){

    returnStatus = read(sock, &requestToJoin, sizeof(int));
    if (returnStatus < 0) 
        error("ERROR reading from socket");
    else{
        /* Insert Data to global Pointer */
    }

}

3 个答案:

答案 0 :(得分:3)

这是一个多进程服务器而不是多线程的,在父进程和子进程之间不共享全局数据它在某一点被复制,如果你想在多个进程之间共享数据,你应该查看shared memorypthreads如果你想使用线程(分享父母的内存)。如果您的编译器支持C11,您也可以使用<threads.h>

答案 1 :(得分:3)

您使用的是多进程而非多线程

线程共享全局内存(即全局变量)但进程不共享内存(除非您设置共享内存)并且每个都有自己的全局变量集。

答案 2 :(得分:2)

您正在使用fork()。它会创建一个与您的实际流程完全相同的流程,但它不会共享相同的内存。如果使用线程,所有内存寻址都将被共享,您需要同步访问共享内存位置以满足数据的一致性。