Получив блокировку перед созданием потока, а затем сразу же попытавшись получить эту блокировку в вашем новом потоке, вы можете гарантировать, что некоторый код после создания потока выполнится до того, как поток, возможно, получит блокировку.Конечно, было бы проще просто выполнить код перед созданием потока.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void *print_message_function( void *ptr );
static pthread_mutex_t mut;
int main() {
pthread_t thread1;
char *message1 = "Thread 1";
int iret1;
pthread_mutex_init(&mut, NULL);
pthread_mutex_lock(&mut);
/* lock before creating the thread */
iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
printf("Parent first\n");
/* realasing the lock gives the child a chance to acquire it */
pthread_mutex_unlock(&mut);
pthread_join( thread1, NULL);
/* NOTE: iret1 is the result of the create call, not what the thread itself returned */
printf("(Parent)Thread 1 returns: %d\n",iret1);
return 0;
}
void *print_message_function( void *ptr ) {
/* parent already has this lock, so this will always block until they release it */
pthread_mutex_lock(&mut);
char *message;
message = (char *) ptr;
printf("(Child)%s \n", message);
pthread_mutex_unlock(&mut);
return NULL;
}