2011-09-04 126 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); 
}