Linux多线程编程

进程与线程区别

  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,失败返回非 0


2.阻塞在条件变量上
           pthread_cond_wait();
           int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);
           函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。
           被阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可能在被信号中断后被唤醒。
           返回值: 成功返回 0,失败返回非 0

3.用来通知等待条件变量的第一个线程
           pthread_cond_signal();
           int pthread_cond_signal(pthread_cond_t *_cond);
           用来唤醒等待出现与条件变量cond关联条件的第一个线程,唤醒后它会释放掉当前线程占用的信号量的操作
           返回值: 成功返回 0,失败返回非 0

4.阻塞直到指定时间
           pthread_cond_timedwait();
           int pthread_cond_timedwait(pthread_cond_t *cv,pthread_mutex_t *mp, const structtimespec * abstime);
           返回值: 成功返回 0,失败返回非 0


5.通知等待该条件变量的所有线程
           pthread_cond_broadcast();
           int pthread_cond_broadcast(pthread_cond_t *_cond);
           用来唤醒等待出现与条件变量cond关联条件的所有线程
           返回值: 成功返回 0,失败返回非 0

6.释放条件变量
           pthread_cond_destroy();注意:条件变量占用的空间并未被释放。
           pthread_cond_ destroy(pthread_cond_t *cond);
           返回值: 成功返回 0,失败返回非 0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值