Потоки «ожидают родителя» в C - PullRequest
0 голосов
/ 04 сентября 2011

Не могли бы вы показать мне, как я могу сначала распечатать родителя, используя мьютекс ... Спасибо

void *print_message_function( void *ptr );

main() {

     pthread_t thread1;
     char *message1 = "Thread 1";
     int  iret1;


     iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);


     pthread_join( thread1, NULL);

     printf("(Parent)Thread 1 returns: %d\n",iret1);
     exit(0);
}

void *print_message_function( void *ptr ) {

     char *message;
     message = (char *) ptr;
     printf("(Child)%s \n", message);
}

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Получив блокировку перед созданием потока, а затем сразу же попытавшись получить эту блокировку в вашем новом потоке, вы можете гарантировать, что некоторый код после создания потока выполнится до того, как поток, возможно, получит блокировку.Конечно, было бы проще просто выполнить код перед созданием потока.

#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;
}
0 голосов
/ 04 сентября 2011
#include <pthread.h>

static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;

void *print_message_function( void *ptr );

main() {

 pthread_t thread1;
 char *message1 = "Thread 1";
 int  iret1;

 pthread_mutex_lock( &cs_mutex );

 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);

 printf("(Parent)Thread 1 returns: %d\n",iret1);

 pthread_mutex_unlock( &cs_mutex );

 exit(0);
}

void *print_message_function( void *ptr ) {
 pthread_mutex_lock( &cs_mutex );
 char *message;
 message = (char *) ptr;
 printf("(Child)%s \n", message);
 pthread_mutex_unlock( &cs_mutex );
}
...