Ваш код правильно использует malloc
и free
, но то, как вы это делаете, делает реализацию более сложной, чем необходимо. Функция pthread_create
работает путем записи идентификатора нового потока в память, указанную его первым параметром. В вашем случае вы динамически распределяете этот буфер, а затем немедленно освобождаете его. Следовательно, память ограничена одной итерацией цикла while
. Если это то, что вам нужно, вам, вероятно, лучше просто выделить pthread_t
в стеке и передать указатель на него в pthread_create
:
while (1)
{
pthread_t child;
/* ... */
pthread_create(&child, NULL, interpretMessage, NULL);
}
Теперь, когда child
локально ограничен в цикле, управление памятью будет обрабатываться автоматически без необходимости вызова malloc
или free
.
Что касается вашего второго вопроса о том, продолжает ли элемент управления free (child)
и затем возвращаться к вершине цикла после вызова pthread_create
, да, это правильно. Будет создан второй поток под управлением interpretMessage
, поэтому возможна некоторая задержка, если исходный процесс задерживается, но управление возобновляется с этой точки.
Что касается вашего последнего вопроса, если все пять человек подключаются одновременно, то в следующие пять раз, когда вы наберете accept
, функция предоставит один сокет для следующего входящего соединения. То есть ОС автоматически ставит в очередь входящие соединения в некотором порядке, и на каждой итерации цикла ваш код будет замечать наличие соединения, получать для него сокет, а затем создавать поток для обработки сообщения.
Одна вещь, которую я заметил в вашем коде - когда вы порождаете поток для вызова interpretMessage
, вы не предоставляете никаких аргументов функции, и поэтому каждый поток будет работать без какого-либо контекста о том, как он был создан. , Было ли это преднамеренным?