线程相关API

1、创建线程

int pthread_create(pthread_t * thread_id,__const pthread_attr_t * __attr,void *(*__start_routine) (void *),void *__restrict __arg);
参数说明:第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。如果线程运行函数
不需要参数,最后一个参数可以设为空指针NULL。第二个参数我们也设为空指针,这样将生成默认属性的线程。

返回值:当创建线程成功时,函数返回0,若不为0 则说明创建线程失败,常见的错误返回代码为EAGAIN 和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

2、等待指定的线程结束

pthread_join 函数用来等待一个线程的结束。函数原型为:int pthread_join (pthread_t __th, void **__thread_return)
参数说明 :第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。

3、线程退出函数

函数原型:void pthread_exit (void *__retval)

唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return.最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH.

  在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit.下面,我们来了解线程的一些常用属性以及如何设置这些属性。

互斥锁相关

  互斥锁用来保证一段时间内只有一个线程在执行一段代码。

4、 互斥量初始化:
pthread_mutex_init (pthread_mutex_t *,__const pthread_mutexattr_t *)
5、 销毁互斥量:
int pthread_mutex_destroy (pthread_mutex_t *__mutex);
6、 再试一次获得对互斥量的锁定(非阻塞):
int pthread_mutex_trylock (pthread_mutex_t *__mutex);
7、 锁定互斥量(阻塞):
int pthread_mutex_lock (pthread_mutex_t *__mutex);
8、解锁互斥量
int pthread_mutex_unlock (pthread_mutex_t *__mutex)



条件变量
         使用互斥锁来可实现线程间数据的共享和通信,互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线线程间的同步。

9、条件变量的初始化

条件变量的结构为pthread_cond_t,函数pthread_cond_init()被用来初始化一个条件变量。它的原型为:
int pthread_cond_init (pthread_cond_t * cond, __const pthread_condattr_t *cond_attr)
其中cond 是一个指向结构pthread_cond_t 的指针,cond_attr 是一个指向结构pthread_condattr_t 的指针。结构pthread_condattr_t 是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有
未被使用时才能重新初始化或被释放。释放一个条件变量的函数为pthread_cond_ destroy(pthread_cond_t cond)。

10、等待条件变量(阻塞)

extern int pthread_cond_wait (pthread_cond_t *__restrict__cond,pthread_mutex_t *__restrict __mutex)
线程解开mutex 指向的锁并被条件变量cond 阻塞。线程可以被函数pthread_cond_signal 和函数pthread_cond_broadcast 唤醒,但是要注意的是,条件变量只是起阻塞和唤醒线程的作用,具体的判断条件还需用户给出,例如一个变量是否为0 等等,这一点我们从后面的例子中可以看到。线程被唤醒后,它将重新检查判断条件是否满足,如
果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。这个过程一般用while语句实现。

11、获取线程自身ID

pthread_t pthread_self( void);
函数作用:获得 线程自身的ID。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则显示结果出问题。
12、测试两个线程号是否相同
int pthread_equal(pthread_t threadid1, pthread_t thread2)  判断两个线程ID是否相等,返回0 不相等,非零相等。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值