我想知道如果兩個線程同時調用相同的函數會發生什麼情況,並且函數是通過套接字發送文本的UDP客戶端。如果多個pthread使用相同的函數,會發生什麼
考慮到下面的代碼,我一直在運行它,但我還沒有得到任何錯誤。我不知道它是否會因爲線程同時使用相同的源(函數,變量,IP,端口)而崩潰,以及它們如何共享源?我可以想象下面的代碼是多線程的錯誤用法,你能否解釋一下如何使用這些線程,以便一個線程可以使用該函數,而不是其他線程正在使用該函數?換句話說,它怎麼可能是線程安全的?
爲Linux中的示例C代碼:
void *thread1_fcn();
void *thread2_fcn();
void msg_send(char *message);
int main(void){
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, thread1_fcn, NULL);
pthread_create(&thread2, NULL, thread2_fcn, NULL);
while(1){}
return 0;
}
void *thread1_fcn(){
while(1){
msg_send("hello");
usleep(500);
}
pthread_exit(NULL);
}
void *thread2_fcn(){
while(1){
msg_send("world");
usleep(500);
}
pthread_exit(NULL);
}
void msg_send(char message[]){
struct sockaddr_in si_other;
int s=0;
char SRV_IP[16] = "192.168.000.002";
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(12346);
si_other.sin_addr.s_addr = htonl(INADDR_ANY);
inet_aton(SRV_IP, &si_other.sin_addr);
sendto(s, message, 1000, 0, &si_other, sizeof(si_other));
close(s);
}
調用同一個函數沒有問題(每個線程都有自己獨立的執行上下文和堆棧)。有*可能會*訪問共享狀態(包括庫調用中的共享狀態) - 考慮自我分析代碼以查看共享狀態(如果有),並圍繞此問題集中討論問題。 – user2246674
自動變量的美妙之處在於,一切都自動運行。 –
'thread1_fcn()'和'thread12_fcn()'仍應該聲明爲一個'void *'參數來匹配'pthread_create()'的期望值。 – jxh