1

競合状態の問題に直面していると思いますが、よくわかりません。以下は私のコードです。

while(1) 
{
    int newsocket_fd; = accept(socket_fd,(struct sockaddr *) &client_addr, &client_len);

    if (newsocket_fd < 0) 
    {
          perror("Error on accept");
    }
    else
    {
        pthread_create( &threadNewClient, NULL, NewClient, (void *)&newsocket_fd);
    }
}

スレッド引数としてint変数(newsocket_fd)のアドレスを送っています。

void* NewClient(void * thread_args)
{
    int client_socket = *(int*)thread_args;
    char buffer[256];   
    int n;
    stringstream userInput,responseString; 

    printf(KBLU "Client conneted  %d\n",client_socket);
}

ここでは、スレッド引数を受け取り、それを型キャストしています。その値を出力 (または使用) すると、ほとんどの場合、前のスレッド (同じスレッド関数) に送信される値が返されます。ネットで検索したところ、競合状態が原因であると誰かが示唆しています。

引数としてアドレスの代わりに値を送信すると、正常に動作します。異なる値を持つ同じアドレスにアクセスしていますが、競合状態になる可能性があります。

前もって感謝します。

@編集: int newsocket_fd を作成しました。内部 while ループ。

4

2 に答える 2

7

スタックにある整数 ( newsocket_fd) のアドレスを送信しているためです。これは、次にソケットが受け入れられたときに再利用されます。整数値を送信するだけで何が問題になっていますか?

于 2013-06-19T09:49:12.360 に答える
3

newsocket_fd新しいスレッドが指定したポインターからそれを読み取る前に、変更される (またはさらに悪いことに、破棄されて再作成される) 可能性があります。これは間違いなく競合状態です。

最も簡単な修正は、スレッド間で同じ変数を共有しないことです。何らかの理由で絶対に実行する必要がある場合は、同期オブジェクト (条件) を使用して、スレッドが読み取りを完了する前に変更されないようにする必要があります。

于 2013-06-19T09:48:20.470 に答える