Linux 系统编程并发/线程介绍

线程是操作系统调度的最小单位

线程拥有自己独立的栈空间

临界区: 访问共享资源的一段代码, 资源通常是一个变量或数据结构

竞争条件: 多个执行的线程大致同时进入临界区,都试图跟新数据结构

此时会出现运行结构不确定性

为什么会出现这种不确定性?

试想线程A在CPU中修改了共享变量的值,线程已经运行完,还没来得及写回内存,就被线程B抢走时间片,那么就会出错。

为了避免这些问题,线程应该使用某种互斥机制,这样保证只有一个线程进入临界区,从而避免出现竞争,并产生确定的程序输出。

线程创建的API函数是

pthread_create(....)

其中有四个参数,第一个参数是指向pthread_t 结构体的指针,利用这个结构体与线程进程交互, 第二个参数指定线程可能具有的属性,默认情况,直接填NULL, 第三个参数是一个函数指针,这个函数的返回值必须为void*,第四个参数是一个vod*类型的指针,是第三个函数的参数。需要将这个类型转为需要的参数使用。

线程创建完后,通常使用pthread_join(...)函数启动,并且主线程等待线程函数执行完毕,这个函数同样有两个参数,第一个参数是线程的pthread_t结构体,第二个参数是void*,用来得到返回的参数。

互斥锁:

多个线程访问临界区时,需要加锁,使得只有一个线程能进入临界区,加锁的API函数有

pthread_mutex_t lock;
pthread_mutex_init(&lock)
pthread_mutex_lock(&lock)
// 临界区
pthread_mutex_unlock(&lock)

条件变量:

当线程之间发生某种信号,如果一个线程在等待另一个线程继续执行某些操作,条件变量很有用。

调用逻辑如下:

pthread_mutex_t lock = PTHREAD_MUTEX_INITALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
Pthread_mutex_lock(&lock);
while (ready == 0){
    Pthread_cond_wait(&cond,&lock)
}
Pthread_mutex_unlock(&lock)

唤醒线程的代码如下

Pthread_mutex_lock(&lock);
ready = 1;
Pthread_cond_signal(&cond);
Pthread_mutex_unlock(&lock);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值