多线程

  线程是程序执行的最小单位,线程的目的是为乐更好的支持多cpu和减小上下文切换的开销。一个进程至少拥有一个线程,当运行在单cpu上时,采用多线程可以使设计更简洁,程序执行效率更高;如果运行在多cpu机器上,可以用多个cpu执行各个线程,做到真正的并行处理。

  linux下最常使用的是pthread库,需要使用到pthread_create等函数。

int create_thread(void *(*strat_routine)(void*), void *arg, pthread_t *thread, pthread_attr_t *pAttr);
void begin_thread();
void end_thread();
int g_cur_thread_num = 0;

pthread_mutex_t gctn_lock = PTHREAD_MUTEX_INITIALIZER;

int create_thread(void *(*start_func)(void *), void *arg, pthread_t *pid, pthread_attr_t pAttr)
{
    pthread_attr_t attr;
    pthread_t pt;

    if(pAttr == NULL)
    {
         pAttr = &attr;
         pthread_attr_init(pAttr);
         pthread_attr_setstacksize(pAttr, 1024*1024);
         pthread_attr_setdetachstate(pAttr, PTHREAD_CREATE_DETACHED);
    }

    if(pid == NULL)
        pid = &pt;

    int rv = pthread_create(pid, pattr, start_func, arg);
    pthread_attr_destory(pAttr);
    return rv;
}

void begin_thread()
{
    LOG(LOG_LEVEL_DEBUG, "begin thread %lu.", pthread_self());
}

void end_thread()
{
    pthread_mutex_lock(&gctn_lock);
    --g_cur_thread_num;
    LOG(LOG_LEVEL_DEBUG, "End Thread %lu, cur_thread_num = %d", pthread_self(), g_cur_thread_num);
     pthread_mutex_unlock(&gctn_lock);
}

  这里使用的几个函数是pthread_create、pthread_attr_init、pthread_attr_setstacksize、pthread_attr_setdetachstate、pthread_attr_destroy、pthread_mutex_lock、pthread_mutex_unlock.

  pthread_create的原型是:

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg);

  pthread_create的作用是创建一个新的线程,创建的线程id将存储在thread参数中,attr指定线程所需的参数,线程创建完毕后,将运行start_routine函数,arg是start_routine的参数。

  pthread_attr_init的原型是:

int pthread_attr_init(pthread_attr_t *attr);

  pthread_attr_destroy的原型是:

int pthread_attr_destroy(pthread_attr_t *attr);

  这两个函数的作用相反,一个是初始化线程对象的属性,一个是去除初始化。

  pthread_attr_setdetachstate的原型是:

int pthread_attr_setdetachstate(pthread_attr_t *attr int detachstate);

  pthread_attr_setdetachstate的作用是设置线程是分离的,线程有两种状态,一种是joinable,一种是detached。在使用线程时,为了避免结束后线程的资源得到不正确释放,从而产生内存泄漏,对于joinable状态的线程,需要调用pthread_join函数来回收资源,要么就是将线程设置为detached,这种状态的线程在结束后,西涌回自动回收它所占的资源。

  pthread_attr_setstacksize的原型是:

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

  系统的默认堆栈大小是8192字节,pthread_attr_setstacksize的作用是设置堆栈大小。

  pthread_mutex_lock的原型是:

int pthread_mutex_lock(pthread_mutex_t *mutex);

  pthread_mutext_unlock的原型是:

int pthread_mutex_unlock(pthread_mutex_t *mutex);

  作用是加锁和释放锁。

  

posted on 2017-05-15 14:45  残余的光  阅读(186)  评论(0编辑  收藏  举报

导航