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

これはマルチスレッドではないマルチプロセスサーバーであり、グローバルデータは親プロセスと子プロセス間で共有されず、特定の時点で複製されます。複数のプロセス間でデータを共有したい場合は共有メモリ調べる必要があります。スレッドを使用します (親のメモリを共有します)。コンパイラがC11をサポートしている場合は、使用することもできます<threads.h>

于 2012-12-30T16:15:16.280 に答える
3

使用しているのはマルチプロセスであり、マルチスレッドではありません。

スレッドはグローバル メモリ (つまり、グローバル変数) を共有しますが、プロセスはメモリを共有せず (共有メモリを設定しない限り)、それぞれに独自のグローバル変数のセットがあります。

于 2012-12-30T16:16:24.290 に答える
2

fork() を使用しています。実際のプロセスの正確なコピーであるプロセスを作成しますが、同じメモリを共有しません。スレッドを使用する場合、すべてのメモリ アドレッシングが共有されるため、データの一貫性を満たすために、共有メモリ位置へのアクセスを同期する必要があります。

于 2012-12-30T22:31:47.203 に答える