[英]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.