簡體   English   中英

如何才能成為比賽條件。 還是我的代碼有問題

[英]How it can be a race condition. Or it is something wrong with my code

我認為我面臨比賽條件的問題,但不確定。 以下是我的代碼。

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);
}

在這里,我正在接收線程參數並進行類型轉換。 當我打印(或使用)它的值時,大多數情況下都會給出發送到先前線程的值(相同的線程函數)。 我在網上搜索,有人認為這是由於種族狀況。

當我發送值而不是地址作為參數時,它可以正常工作。 我正在訪問具有不同值的同一地址,這可能是競爭條件。

提前致謝。

@Edit:創建int newsocket_fd; 在while循環內。

因為您要發送一個位於堆棧中的整數( newsocket_fd )的地址。 下次接受套接字時,它將被重用。 僅發送整數值有什么問題?

在新線程從您給它的指針中讀取newsocket_fd可能會對其進行修改(或更糟糕的是,銷毀並重新創建)。 這絕對是比賽條件。

最簡單的解決方法是在線程之間不共享相同的變量。 如果您絕對出於某種原因必須執行此操作,則必須確保使用某種同步對象(條件)在線程完成讀取它之前不會對其進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM