不保留其在线程值全局变量(global variable not retaining its val

2019-10-17 13:15发布

我做了一个多线程的服务器,它有一个全球性的指针链表,在线程我试图插入一些数据,但这些数据(我插入)不保留,是有可能在线程全局值不保留。 我使用下面的代码(这是一个简单的版本。)

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 */
    }

}

Answer 1:

这不是多线程,全局数据并不父母和孩子之间共享的多进程服务器处理它就会在某一点重复,你应该考虑共享内存 ,如果你想分享多进程之间或数据并行线程 ,如果你想使用线程(其中共享他们的父进程的内存)。 如果你的编译器支持C11 ,你也可以使用<threads.h>



Answer 2:

你所使用的多进程而不是多线程

线程共享全局内存(即全局变量),但进程不共享内存(除非你设置共享内存),每个人都有自己的一套全局变量。



Answer 3:

您正在使用fork()的。 它创建了一个过程,是你的实际过程的准确复制,但它不共享相同的内存。 如果你使用线程所有的内存寻址将被共享的,你需要同步的访问共享存储位置,以满足数据的一致性。



文章来源: global variable not retaining its value in thread