文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一文搞懂Linux线程同步原理

2024-11-30 04:14

关注

1.背景知识

1.1 原子变量和原子操作

原子变量和原子操作是多线程编程中的重要概念,用于保证多线程环境下的数据同步和互斥。原子操作是指不会被线程调度机制打断的操作,一旦开始就会一直运行到结束,中间不会切换到其他进程。原子变量是原子操作的基本单位。

C11标准引入了原子类型和原子操作,用于在多线程环境下保证数据的同步和一致性。

常见原子变量类型:

图片

常见原子操作:

图片

1.2 futex系统调用

futex是Linux内核提供的一种系统调用,用于实现用户空间线程之间的同步和互斥。它是fast userspace mutex的缩写,意为快速用户空间互斥锁。futex的主要作用是在用户空间实现锁和条件变量,避免了用户空间和内核空间之间的频繁切换,从而提高了多线程程序的性能。

futex系统调用的基本用法是:

一个线程在需要锁或等待条件变量时,调用futex系统调用,将自己挂起。

另一个线程在释放锁或改变条件变量时,调用futex系统调用,唤醒等待的线程。

1.2.1 futex函数原型

int futex(int *uaddr, int futex_op, int val, const struct timespec *timeout, int *uaddr2, int val3);

功能:futex函数是Linux内核提供的一种轻量级的锁机制,它可以用于用户空间进程间的同步。

参数:

uaddr:指向等待的变量的指针。

futex_op:表示要执行的操作,可以是以下值之一:

val:与操作相关的值。

timeout:超时时间。

uaddr2:第二个等待变量的指针。

val3:与第二个等待变量相关的值。

1.2.2  futex实现原理

图片

通过futex系统调用执行FUTEX_WAIT命令,可以将线程挂起,futex传入的uaddr参数会通过hash函数转换成hash值,通过hash值能索引到futex_hash_bucket,此时会创建futex_q节点,futex_q节点会存储哈希key,线程相关信息,futex_q节点会插入chain链表。

通过futex系统调用执行FUTEX_WAKE命令可唤醒挂起线程,futex系统调用通过uaddr参数找到对应的futex_q节点,然后唤醒futex_q节点指向的挂起线程。

2.线程为什么需要同步?

Linux线程是在Linux操作系统中实现的一种轻量级进程,也称为轻量级进程或者LWP。同一线程组的线程共享主线程(进程)的地址空间、文件描述符、信号处理等资源。

在Linux中,CPU的调度是以线程为单位进行调度的,因此线程的调度也是以线程为单位进行调度的。

图片

由于线程之间共享地址空间,文件描述,信号相关资源,所以线程之间必然会存在同时访问同一资源的问题,如果不进行线程同步,就会导致数据的不一致性和安全性问题。同步可以保证在同一时刻只有一个线程访问共享资源,从而避免了数据的冲突和错误。

3. 互斥锁实现原理

互斥锁的实现视基于原子操作和futex系统调用实现。

3.1 互斥锁常见操作

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_lock(&mutex);

pthread_mutex_unlock(&mutex);

pthread_mutex_trylock(&mutex);

pthread_mutex_destroy(&mutex);

3.2 互斥锁实现原理

图片

互斥锁本质是一个原子变量,原子变量同样是一个共享变量,不同的线程都能访问,只不过原子变量采用的是原子操作,互斥锁的操作不可被中断。

1)互斥锁初始化

将原子变量设置成0,原子变量不同的值代表锁不同的状态:

2)互斥锁加锁

3)互斥锁解锁

总结:

互斥锁虽然有很多优点,能够很方便的进行线程同步,但是互斥锁是通过futex系统调用实现,采用系统调用必然存在用户态和内核态的切换问题,如果这种切换很频繁的话,必然会影响系统性能和降低系统效率,后续我们将继续探索更为高效的线程同步方式。

来源:物联网心球内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯