2012-12-30 60 views
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 */ 
    } 

} 
+3

該代碼中沒有線程。 – netcoder

回答

3

這不是多線程,全局數據並不父母和孩子之間共享的多進程服務器進程它在某一點被複制,你如果要共享多個進程之間的數據,或者想要使用共享其父內存的線程,應該查看shared memorypthreads。如果你的編譯器支持C11你也可以使用<threads.h>

+0

或''如果C11可用(雖然我仍然更喜歡pthreads)。 – netcoder

+0

@netcoder謝謝,更新。 – iabdalkader

3

你所使用的多進程而不是多線程

線程共享全局內存(即全局變量),但進程不共享內存(除非您設置共享內存)並且每個線程都有自己的一組全局變量。

2

您正在使用fork()。它會創建一個與實際流程完全相同的流程,但它不共享相同的內存。如果你使用線程,所有的內存地址將被共享,並且你需要同步訪問共享內存的位置以滿足數據的一致性。