线程'在C中等待父'

时间:2011-09-04 11:06:28

标签: c multithreading mutex

请您告诉我如何使用互斥锁首先打印父母...谢谢

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 个答案:

答案 0 :(得分:2)

通过在创建线程之前获取锁定然后立即尝试在新线程中获取该锁定,可以保证在创建线程之后的某些代码将在线程可能获得锁定之前执行。当然,在首先创建线程之前运行代码会更简单。

#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;
}

答案 1 :(得分:0)

#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 );
}