6.30笔记

#include <stdio.h>
#include <pthread.h>

int    gcond=0;
pthread_mutex_t        pm;
pthread_cond_t        pcond;

static void *thread_func(void *arg)
{
    do{
        pthread_mutex_lock(&pm);
        //cond wait
        while(!gcond){
            pthread_cond_wait(&pcond, &pm);    
        }
        sleep(1);
        gcond =0;
        printf("thread %d get lock\n", (int)arg);
        pthread_mutex_unlock(&pm);
        sleep(1);    
    }while(1);
    return;
}

int main()
{
    int count = 0;
    pthread_t        p;
    pthread_attr_t        pattr;
    //init
    pthread_mutex_init(&pm, NULL);
    pthread_cond_init(&pcond, NULL);
    pthread_attr_init(&pattr);
    pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED);
    //
    //
    do{
        pthread_create(&p, NULL, thread_func, (void *)count);
        count++;
    }while(count<5);

    do{
        pthread_mutex_lock(&pm);
        gcond =1;
        pthread_cond_broadcast(&pcond);
        pthread_mutex_unlock(&pm);
    }while(count>=0);

    return 0;
}

 

1.  detach , join的问题

 
detach表示线程结束后由系统自动回收。主进程不再管。
join表示主进程一直等待直到线程结束。
 
一个线程必须pthread_join或者pthread_detach,否则内存泄露。
 
如果想创建一个不需要管的线程,
pthread_attr_setdetachstate(atrr, PTHREAD_CREATE_DETACHABLE) 后创建线程就无需担心了
 PTHREAD_CREATE_JOINABLE ,就需要父进程等待了
 
2.  pthread_key_t 线程私有数据
 
线程私有数据,线程之间是相互不干扰的
 
pthread_key_t key
pthread_key_create(&key, NULL)
 
线程中就可以使用 pthread_key_setspecific  pthread_key_getspecific 来完成设置和获取了
 
注意的是: key显然是个每个线程都有的一个特性,例如errno之类。实际上errno就是这么设计的。
 
3.  once 线程强制执行一次, 
 
能够保证初始化,或者特定动作只会被执行一遍。 (例如单例的初始化)
pthread_once_t once=Pthread_ONCE_INIT
 
pthread_once(once,  once_func)
 
 
4.  mutex cond
 
mutex +cond
 
mutex 互斥锁, 确保只有一个线程处理代码块
pthread_mutex_init
pthread_mutex_lock()
pthread_mutex_unlock()
 
 
cond
 
pthread_cond_t
pthread_mutex_lock()
 
while(gcond){  /// 条件满足,挂起,mutex释放
       pthread_cond_wait(&cond, &mutex);
}
//条件不满足了,继续走,mutext也恢复
 
pthread_mutex_unlock()
 
 
pthread_mutex_lock()
//处理gcond
pthread_cond_broadcast()
pthread_mutex_unlock()
 
 
 5. mutex + cond 能多个线程协作完成任务
 
 
 
 
 
 
 
 
posted @ 2014-06-30 17:18  holycrap  阅读(171)  评论(0编辑  收藏  举报