14|标准库:如何使用互斥量等技术协调线程运行?
该思维导图由 AI 生成,仅供参考
使用互斥量
- 深入了解
- 翻译
- 解释
- 总结
C语言中的多线程编程技术是解决并发应用执行正确性和性能要求的重要方法。本文介绍了互斥量、原子操作、条件变量和线程本地变量等概念和使用方法。互斥量通过加锁操作确保多个线程有序地使用共享资源,而原子操作则提供了更便捷的方式避免数据竞争。条件变量可以更好地解决线程间数据依赖的问题,避免忙等待,提高CPU资源利用。线程本地变量可以避免数据竞争,并存储线程独有的信息。通过本文的介绍,读者可以快速了解C语言中使用互斥量和原子操作的方法,以及它们在多线程应用中的重要作用。文章还提到了x86-64指令集中的mfence、lfence和sfence指令的作用,以及鼓励读者进行更多的探索和讨论。
《深入 C 语言和程序运行原理》,新⼈⾸单¥59
全部留言(13)
- 最新
- 精选
- ZR2021使用while是防止广播通知方式的虚假唤醒吧,需要用户进一步判断,但是,我看还有人说可能存在非广播方式的虚假唤醒,不知道什么场景下会出现这种情况,还有,我们现在使用的都是pthread 库,不知道跟老师讲的c库自带的这些原子等操作有什么区别……
作者回复: 1. 没错!防止 Spurious Wakeup 是其中一个重要原因; 2. 实际上 C 标准中的大部分线程控制,以及条件变量等能力的实现,在 Unix 等系统上都是直接通过 pthread 库来实现的。你会发现接口使用上虽然有差异,但却也并不大。C 标准只是将最小的可用子集进行了标准化。
2022-01-184 - ckj请问下 条件变量的例子中 21行 main中的互斥量重新加锁是不是需要等run中的释放之后才能加锁? 因为mtx_plain?
作者回复: 是这样的。
2022-05-212 - 墨用了条件变量后,还是有循环一直在判断 done 的值啊,只不过变成到 main 函数中判断了,感觉和之前没啥区别啊
作者回复: 实际上这里的 while 循环不会持续执行,所有执行到 cnd_wait 的线程都会被阻塞,直到有子线程在适当时刻通过 cnd_signal “通知” main 线程。
2022-02-132 - 白花风信子并发编程这儿感觉有点不熟悉.....请问有什么练习的建议吗?感觉和平常接触的有很多不同。
作者回复: 并发编程由于相关概念较多,可以试着先从 13 14 这两讲中提到的基础内容熟悉起来。比如可以找一本专门讲并发编程的书看,这样可以有一个较为统一和完整的认知。当然,专门讲 C 并发的书不是很多,可以选择性看看 Thierry Delisle 写的《Concurrency in C》 ,或者《C++ Concurrency in Action》。
2022-01-152 - 赖淦老师,条件变量和信号量是相同的概念吗?
作者回复: 不是哈。
2022-07-1721 - 左星辰memory_order的设置会被编译器处理很好理解,但是是如何被处理器理解的呢?
作者回复: memory_order 的设置会被编译器编译为对应平台上的 fence 指令,比如 x86-64 下的 mfence、lfence 与 sfence 指令。可以看看这三个指令的具体用途,其他平台均是类似的。
2022-04-241 - 猪小擎mutex有syscall吗?需要调用fetex系统调用吗?写一段cpp代码,在20个线程里每个县城++10万次,一个用mutex抢一个锁,一个用原子变量++,在mac的m1 max上运行,mutex要快得多
作者回复: 据我所知 mutex 没有直接对应的 syscall,Linux 上的 mutex 是基于 futex 实现的。
2022-06-15 - liu_liu使用 while 的原因是,当阻塞的线程被重新调度运行时,done 的值可能被改变了,不是预期值。2022-01-1414
- dapaul老师,使用条件变量那段的例子不会死锁吗?main线程中加锁,然后阻塞等待,锁没释放。创建的线程等锁去释放条件变量,一直等不到锁,两边都在等2022-07-1423
- Cyan提个问题,问什么我将“使用条件变量”的C语言程序,改为C++程序,程序退出的时候就会报core dump呢?具体的程序如下: ``` #include <iostream> #include <mutex> #include <condition_variable> #include <thread> #include <chrono> std::mutex mtx; std::condition_variable cv; int done = 0; int run(void) { std::unique_lock<std::mutex> lock(mtx); done = 1; cv.notify_one(); lock.unlock(); return 1; } int main(void) { std::thread thd(run); std::unique_lock<std::mutex> lock(mtx); while (done == 0) { cv.wait(lock); } lock.unlock(); std::cout << "The value of done is: " << done << std::endl; return 0; } ``` 解答成在lock.unlock()前添加一行trd.join()即可,但是我不太理解,麻烦各位大佬答疑解惑2023-11-07归属地:广东1