我创建了一个多线程服务器,它有一个指向链表的全局指针,在线程中我试图插入一些数据,但是那个数据(我插入的)没有保留,是否有可能在线程中表示全局值不保留。我使用以下代码(这是最简单的版本。)
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 */
}
}
答案 0 :(得分:3)
这是一个多进程服务器而不是多线程的,在父进程和子进程之间不共享全局数据它在某一点被复制,如果你想在多个进程之间共享数据,你应该查看shared memory或pthreads如果你想使用线程(分享父母的内存)。如果您的编译器支持C11,您也可以使用<threads.h>
答案 1 :(得分:3)
您使用的是多进程而非多线程。
线程共享全局内存(即全局变量)但进程不共享内存(除非您设置共享内存)并且每个都有自己的全局变量集。
答案 2 :(得分:2)
您正在使用fork()。它会创建一个与您的实际流程完全相同的流程,但它不会共享相同的内存。如果使用线程,所有内存寻址都将被共享,您需要同步访问共享内存位置以满足数据的一致性。