【2017-06-20】Linux应用开发工程师C/C++面试问题之一:Linux多线程程序的同步问题

参考之一:Linux 线程同步的三种方法

链接地址:http://www.cnblogs.com/eleclsc/p/5838790.html

简要回答:

Linux下线程同步最常用的三种方法就是互斥锁、条件变量及信号量。

互斥锁通过锁机制来实现线程间的同步,锁机制是同一时刻只允许一个线程执行一个关键部分的代码。

条件变量是用来等待而不是用来上锁的,条用来自动阻塞一个线程,直到某特殊情况发生为止,通常条件变量和互斥锁同时使用。

线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作,如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。

信号量最常用的就是二值信号量,及只能有0与1两个值,有时候也叫单值信号量。

但有一个问题,线程同步时如何选择信号量或互斥锁?

这里百度到一个关于互斥锁和信号量的区别:

1. 互斥锁用于线程的互斥,信号量用于线程的同步;

这是两者的根本区别,也就是互斥和同步的区别

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性,但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上,这是大多数情况,通过其它机制实现访问者对资源的有序访问。

在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的,少数情况是指可以允许多个访问者同时访问资源。

2. 互斥量值只能为0/1,信号量值可以为非负整数。

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。

信号量可以实现多个同类资源的多线程互斥和同步。

当信号量为单值信号量时,也可以完成一个资源的互斥访问。

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

时间: 2024-08-27 16:19:39

【2017-06-20】Linux应用开发工程师C/C++面试问题之一:Linux多线程程序的同步问题的相关文章

与一线Linux嵌入式开发工程师的对话

转:与一线Linux嵌入式开发工程师的对话 陈工程师一直做Linux的嵌入式开发,作为在开发一线的工程师,他对很多问题的看法可能更切合实际需求,于是,通过邮件,就嵌入式开发方面的问题,请他谈了一下自己的看法: 问:关于嵌入式开发,我们准备给同学们讲解一些入门知识,从你一线开发经验来说,给我们一些建议: 陈工回答: 对于嵌入式Linux入门,如果有一定基础,可以从驱动开始:如果没有基础,我个人建议还是从应用程序开始.因为从应用程序开始是最容易的,也是 最直观的.而驱动程序运行在内核态,驱动本身的结

嵌入式系统Linux内核开发工程师必须掌握的三十道题 (转)

1)      Linux中主要有哪几种内核锁?2)      Linux中的用户模式和内核模式是什么含意?3)      怎样申请大块内核内存?4)      用户进程间通信主要哪几种方式?5)      通过伙伴系统申请内核内存的函数有哪些?6)      通过slab分配器申请内核内存的函数有?7)      Linux的内核空间和用户空间是如何划分的(以32位系统为例)?8)      vmalloc()申请的内存有什么特点?9)      用户程序使用malloc()申请到的内存空间在

【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题

Tencent后台服务器开发有一道题是计算一个结构体的sizeof的大小: struct strData { int m_Int; char m_Char; short m_Short; char m_Flag; } 系统为32位的Unix机器,请问sizeof(strData)的值是多少? 在32位系统中,int类型为4个字节,char类型为1个字节,short为2个字节,所以理论上上述结构体占用的空间总共为8个字节: 但是,内存存放数据时如果各种类型合理对齐时,cpu访问数据的效率就比较高:

2017.06.20

1.static属性是整个类的共享属性,所以按照我们的理解这应该是大范围包括小范围,从大范围中可以调取小范围的数据,但是从小范围中无法显示大范围数据,即不管创建了多少个对象,静态属性在内存中只有一个 2.private static int count中count++和private int a中a++的区别在于count已经有了一个内存地址,而a没有 3.static方法可以使用对象调用,也可以直接用类名调用,多数用类名直接调用(方便) 4.本类的方法之间的调用 任何方法都可以直接调用静态方法

浅谈Java后端开发工程师腾讯面试经历分享总结

最近一段时间考虑到换工作,打算整理一下网络上曾经面试者分享的的面试经历并结合自己以往的面试经历和经验,帮助大家获取到互联网大厂的入职通知书,也就是入职offer. 本文整理网络面试者和本人的面试经历和面试经验分享给大家,主要出于个人层面上做个自我总结.沉淀一下面试经历以及让一些有能力的面试者了解一些互联网大厂企业面试过程,如果有人向往这些大厂企业,告知面试者需要做哪些准备从而能够如愿以偿的获取到互联网大厂企业的入职通知书. 面试做好提前准备 一谈到面试这个问题,很多人都会心里一紧,尤其是一些生性

零基础嵌入式Linux开发工程师培训视频

零基础嵌入式Linux开发工程师高端培训(ARM实战.系统移植.驱动开发.网络电子书开发)适合人群:初级课时数量:336课时用到技术:ARM实战.系统移植.驱动开发涉及项目:网络电子书开发.案例咨询qq:1840215592 课程大纲:C语言基础篇:实用嵌入式C Linux程序设计第一章 嵌入式开发基础及功能演示第二章 C语言基础第三章 C语言中的循环第四章 数组和字符串第五章 函数和指针 Linux应用篇:嵌入式Linux应用程序开发第一部分:嵌入式软硬件平台概述第二部分:嵌入式linux系统

(14)嵌入式软件开发工程师技能要求总结

找准一个行业方向:音视频.人工智能.深度学习.视觉识别.机器学习 嵌入式软件开发工程师: 技能要求: 熟悉Linux操作系统.shell脚本语言.mysql的开发,部署,优化优先.掌握数据结构,常用算法; 1.数字模拟电路.熟练Protel99/Altium/PADS一种或多种电路硬件设计软件: 2.熟悉UART,IIC,SPI.蓝牙协议栈.通讯协议: 3.熟练掌握socket.多线程编程,对tcp/ip协议有一定的理解; 4.熟悉Keil或IAR嵌入式系统开发工具. 至少精通ARM.AVR.S

嵌入式Linux驱动开发实战教程

嵌入式Linux驱动开发实战教程(内核驱动.看门狗技术.触摸屏.视频采集系统) http://www.ibeifeng.com/goods-475.html 咨询QQ2110053820 课程讲师:韩老师 课程分类:Linux 适合人群:高级 课时数量:109课时 更新程度:完成 用到技术:嵌入式 Linux 涉及项目:驱动开发.看门狗技术.触摸屏.视频采集 课程简介:    嵌入式软件开发无疑是当今最热门的行业,嵌入式软件工程师的薪资比普通的软件工 程师的薪资平均高50%以上.随着智能控制.物

如何进行Linux Kernel 开发

转自:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html 如何进行Linux Kernel 开发? (Take 3) 译者序:这是一篇很重要的文档,它介绍了内核开发的方方面面.这篇文档已被加入到内核源码树的Documentation文档里(名字为HOWTO),你可以在最新的内核树里找到它.尽管已经有网友翻译过这篇文档,但是我还是决定自己再翻译一遍.翻译完之后,我的感触是如果依靠翻译来进行学习,速度太慢了.以后的技术文档直接看