2011-09-04 124 views
0

能否请你告诉我,我怎么能先打印父使用互斥的方式......感谢线程在C“等待父”

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

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

#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

了解..非常感谢... – Shaun

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