多线程基础
墨篙和小奶猫
车联网以及嵌入式开发 优化理论 故障诊断
展开
-
多线程基础之五:Windows API提供的mutex和semaphore性能比较
Windows系统提供HANDLE WINAPI CreateSemaphore(xxx)和HANDLE WINAPI CreateMutex(xxx)直接提供Mutex和Semaphore两种内核对象供程序员使用在临界区互斥操作。在前面的多线程基础之一提到过Semaphore存在Binary和Counting两种,其中Binary Semaphore等同于Mutex,而Counting Semap原创 2017-11-17 23:15:07 · 1456 阅读 · 0 评论 -
多线程基础之六:Pthread Win32实现的非阻塞请求机制的Semaphore
前面看到Windows API直接提供的Semaphore并没有为其配备等待队列,从而无法实现非阻塞请求机制以实现操作加速,对于临界区耗时的情况下,显然是存在实现非阻塞请求机制的Semaphore的。Linux下的Pthread库实现了这样的增加版Semaphore,幸运地是有Pthread的Win32版本。前面讲解到其实Semaphore的完整结构体内容应该如下typedef struct{原创 2017-11-17 23:46:15 · 696 阅读 · 0 评论 -
多线程基础之一:进程间同步问题的来源和解决方案
同步问题诞生的最本质的原因:In fact, a process may be interrupted at any point in its instruction stream, and processing core may be assigned to execute instructions of another process.总之一句话,关于共享对象的更改操作并非原子操作,如假设两个进原创 2017-11-15 00:12:12 · 1556 阅读 · 0 评论 -
多线程基础之二:mutex和semaphore使用方法
mutex和semaphore都是内核对象,是用来实现多进程间或多线程锁机制的基础。本文将要介绍两者的使用方式。 0. 多线程锁机制涉及的Windows API创建mutex内核对象,用来作为线程间或进程间通信的API接口如下HANDLE WINAPI CreateMutex( __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BO原创 2017-11-15 00:42:27 · 3245 阅读 · 0 评论 -
多线程基础之三:使用event, mutex, semaphore实现多进程间互斥
前面文章介绍了使用mutex和semaphore在多线程场景中实现线程互斥。事实上,因为mutex, semaphore是内核对象,虽然是在某一个进程中创建的,但是由于进程间可以共享内核模块,故而使用mutex, semaphore在进程间作为互斥标识量也是可以的。 0. 使用mutex实现多进程间互斥race_process_mutex_1.cpp#include <stdio.h>#in原创 2017-11-15 09:52:11 · 1816 阅读 · 0 评论 -
多线程基础之四:Linux提供的原子锁类型atomic_t
在x86体系下,任何处理器平台下都会有一些原子性操作,在单处理器情况下,单步指令的原子性容易实现。但是在SMP多处理器情况下,只有那些单字的读(将变量读进寄存器)或写(从寄存器写入到变量地址)才是原子性的。故而在SMP下,要保证特定指令集合的原子性即不被中断,x86提供lock前缀用来在执行被lock修饰的指令期间锁住总线,从而实现了“禁止中断”的效果。事实上,Linux操作系统便根据这种针对特殊数原创 2017-11-15 22:38:42 · 18712 阅读 · 0 评论 -
多线程基础之七:多线程遇上printf的“延迟写”策略
0. 运行库提供的IO读写函数采用“延迟写”策略的原因 编程时经常会用到printf()函数,但是由于printf()函数涉及到和显示器或磁盘等外设进行交互,所以操作涉及到从“用户态–>内核态–>返回用户态”的一系列内核转换过程,但是从用户态通过中断使用系统调用涉及到内核从用户态切换到内核态,上下文切换是间很费时的操作。更糟糕的是,如果printf()的目标设备是显示器这种字符设备(单次传输一个字原创 2017-11-25 23:22:03 · 3628 阅读 · 0 评论