Чтобы сказать, что функция reentrant , она должна полагаться только на то, что локальные переменные будут одновременно вызываться двумя (или более потоками) и возвращать правильные результаты.* Если функция полагается на некоторые общие данные (мы не можем сделать так, чтобы они были повторно введены), мы можем сделать так, чтобы потоко-безопасный вызывался одновременно двумя (или более) потоками, если вседоступ к общим данным сериализуется.
Чтобы сделать вашу функцию поточно-ориентированной, вы должны заблокировать цикл и вставку в threads[]
.Если вы заблокируете только часть цикла, кто-то может изменить содержимое threads
между концом цикла и влиянием на ранг i
.
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
int newThread(int(*pfunc)())
{
pthread_t tid;
pthread_create(&tid, NULL, pfunc, NULL);
int i = 0;
pthread_mutex_lock(&mymutex); // take the lock
while(threads[i] != 0 && i < MAX_NUM_THREADS)
{
if ((MAX_NUM_THREADS - 1) == i)
{
puts("We've run out of threads' number limit\n");
pthread_mutex_unlock(&mymutex); // don't forget to release the lock here too :)
return 1;
}
++i;
}
threads[i] = tid;
pthread_mutex_unlock(&mymutex); // release the lock
pthread_join(tid, NULL);
return 0;
}