pthread_mutex_lock

老子叫甜甜 提交于 2020-02-07 03:20:16

#include <pthread.h> 
#include <unistd.h> 
#include <string.h>
#include <iostream>
 
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
 
struct node { 
int n_number; 
struct node *n_next; 
} *head = NULL; 
 
/*[thread_func]*/ 
static void cleanup_handler(void *arg) 

    printf("Cleanup handler of second thread./n"); 
    free(arg); 
    (void)pthread_mutex_unlock(&mtx); 

static void *thread_func(void *arg) 

    struct node *p = NULL; 
 
    pthread_cleanup_push(cleanup_handler, p); 
    while (1) { 
    pthread_mutex_lock(&mtx);      
    while (head == NULL)   {       
        pthread_cond_wait(&cond, &mtx);
    }
        p = head; 
        head = head->n_next; 
        printf("Got %d from front of queue/n", p->n_number); 
        free(p); 
        pthread_mutex_unlock(&mtx);
    }
    pthread_cleanup_pop(0);
    return 0;
}
 
int main(void) 

    pthread_t tid; 
    int i; 
    struct node *p; 
    pthread_create(&tid, NULL, thread_func, NULL);
    for (i = 0; i < 10; i++) { 
        p = (node*)malloc(sizeof(struct node)); 
        p->n_number = i; 
        pthread_mutex_lock(&mtx);           
        p->n_next = head; 
        head = p; 
        pthread_cond_signal(&cond); 
        pthread_mutex_unlock(&mtx);         
        sleep(1); 
    } 
    printf("thread 1 wanna end the line.So cancel thread 2./n"); 
    pthread_cancel(tid);       
    pthread_join(tid, NULL); 
    printf("All done -- exiting/n"); 
    return 0; 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!