Я не могу понять, почему этот простой сетевой код предотвращает состояние гонки
int main(void) {
...
listen(sd, SOMAXCONN);
for(;;) {
pthread_t t; int *socket;
socket = malloc(sizeof(int));
*socket = accept(sd, NULL, NULL);
pthread_create(&t, NULL, service_request, socket);
pthread_detached(&t);
}
...
}
объяснение, которое мне было дано, заключается в том, что значение дескриптора сокета должно быть выделено в куче, чтобы избежать условия гонки, когда другой accept переопределяет его значение. Чего я не понимаю, так это почему. Что если я просто написал:
int main(void) {
...
listen(sd, SOMAXCONN);
for(;;) {
pthread_t t; int socket;
socket = accept(sd, NULL, NULL);
pthread_create(&t, NULL, service_request, socket);
pthread_detached(&t);
}
...
}
, где я передаю дескриптор сокета "socket" по значению. В любом случае следующее принятие произойдет после того, как pthread_create()
уже был вызван и скопировано значение "socket", в другой итерации цикла for.
Теперь я не уверен, копируется ли значение при вызове процедуры pthread_create()
в main()
или в другой момент. Во втором случае я бы понял состояние гонки.