1

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

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

}
4

3 回答 3

3

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

于 2012-12-30T16:15:16.280 回答
3

您使用的是multi-process而不是multi-threading

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

于 2012-12-30T16:16:24.290 回答
2

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

于 2012-12-30T22:31:47.203 回答