Linux多线程编程

来源:互联网 发布:jquery动态数组 编辑:程序博客网 时间:2024/06/05 09:24

进程与线程区别

  1. 进程–是资源分配的最小单位。
  2. 线程–是程序执行的最小单位。
  3. 进程有独立的地址空间,线程没有独立的地址空间,同一进程里的所有线程共享进程的地址空间。
  4. 一个进程可以包含若干个线程。

一.创建线程

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

    . thread:用来标识一个线程         . attr:用于设置线程的属性,可以使用NULL来使用默认值    . start_routine:线程函数    . arg:传入线程函数的参数

返回值: 成功返回 0,失败返回非 0

二.线程结束

1. void pthread_exit(void *retval);

    . retval:线程结束时的返回值,可由其他函数如pthread_join()来获取

返回值:无

2. int pthread_join(pthread_t thread, void **retval);

   . pthread_join函数会阻塞等待指定线程退出,然后回收资源,这样就有同步的功能,使一个线程等待另一个线程退出,然后才继续运行     . retval:用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)    线程外面用来等待一个线程运行结束,才回收资源,阻塞   

返回值: 成功返回 0,失败返回非 0

3. int pthread_detach(thread_id)(非阻塞,可立即返回)

这个函数的功能是使线程ID为threadid的线程处于分离状态,一旦线程处于分离状态,该线程终止时底层资源立即被回收,否则终止子线程的状态会一直保存(占用系统资源)直到主线程调用pthread_join(threadid,NULL)获取线程的退出状态;通常是主线程使用pthread_create()创建子线程以后,一般可以调用pthread_detach(threadid)分离刚刚创建的子线程,这里的threadid是指子线程的threadid;如此以来,该子线程止时底层资源立即被回收;
被创建的子线程也可以自己分离自己,子线程调用pthread_detach(pthread_self())就是分离自己
返回值: 成功返回 0,失败返回非 0

三.线程间互斥量

1.互斥初始化

    静态的初始化锁:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;    动态的创建:pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)    attr:PTHREAD_MUTEX_INITIALIZER:创建快速互斥锁          PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁、          PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁    返回值: 成功返回 0,失败返回非 0   

2.锁定互斥

    int pthread_mutex_lock(pthread_mutex_t *mutex);返回值: 成功返回 0,失败返回非 0     

3.互斥预锁定

    int pthread_mutex_trylock(pthread_mutex_t *mutex);        调用该函数时,若互斥锁未加锁,则上锁,返回 0;若互斥锁已加锁,则函数直接返回失败,即 EBUSY。        返回值: 成功返回 0,失败返回非 0 

4.解锁互斥

    int pthread_mutex_unlock(pthread_mutex_t * mutex);         返回值: 成功返回 0,失败返回非 0        

5.销毁互斥

    int pthread_mutex_destroy(pthread_mutex_t *mutex);          返回值: 成功返回 0,失败返回非 0     

四.线程间条件量:

1.初始化条件变量           静态分配:pthread_cond_t cv = PTHREAD_COND_INITIALIZER;           动态分配:pthread_cond_init()           int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);           返回值: 成功返回 0,失败返回非 02.阻塞在条件变量上           pthread_cond_wait();           int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);           函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。           被阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可能在被信号中断后被唤醒。           返回值: 成功返回 0,失败返回非 03.用来通知等待条件变量的第一个线程           pthread_cond_signal();           int pthread_cond_signal(pthread_cond_t *_cond);           用来唤醒等待出现与条件变量cond关联条件的第一个线程,唤醒后它会释放掉当前线程占用的信号量的操作           返回值: 成功返回 0,失败返回非 04.阻塞直到指定时间           pthread_cond_timedwait();           int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const structtimespec * abstime);           返回值: 成功返回 0,失败返回非 05.通知等待该条件变量的所有线程           pthread_cond_broadcast();           int pthread_cond_broadcast(pthread_cond_t *_cond);           用来唤醒等待出现与条件变量cond关联条件的所有线程           返回值: 成功返回 0,失败返回非 06.释放条件变量           pthread_cond_destroy();注意:条件变量占用的空间并未被释放。           pthread_cond_ destroy(pthread_cond_t *cond);           返回值: 成功返回 0,失败返回非 0
原创粉丝点击