multithreading - 互斥锁 : what does "blocking" mean?

标签 multithreading locking thread-safety mutex blocking

我一直在阅读多线程和共享资源访问,许多(对我来说)新概念之一是互斥锁。我似乎无法发现的是发现“临界区”被锁定的线程实际发生了什么。它在很多地方都说线程被“阻塞”了,但这意味着什么?是不是暂停了,解开锁会恢复吗?还是会在“运行循环”的下一次迭代中再次尝试?

我问的原因是因为我想让系统提供的事件(鼠标、键盘等)(显然)在主线程上传递,在我的辅助线程的运行循环中的一个非常特定的部分进行处理.因此,无论传递什么事件,我都会在自己的数据结构中排队。显然,数据结构需要一个互斥锁,因为它正在被两个线程修改。缺少的难题是:当事件在主线程的函数中传递时会发生什么,我想将它排队,但队列被锁定?主线程会被挂起,还是会跳过锁定部分并超出范围(丢失事件)?

最佳答案

阻塞意味着执行被卡在那里;通常,线程被系统置于 sleep 状态并将处理器交给另一个线程。当一个线程在尝试获取互斥锁时被阻塞,当互斥锁被释放时会恢复执行,但如果另一个线程抢先获取互斥锁,该线程可能会再次阻塞。

通常有一个尝试锁定操作,如果可能的话,会抓取互斥锁,如果没有,则会返回错误。但是您最终将不得不将当前事件移动到该队列中。此外,如果您延迟将事件移动到处理它们的线程,则无论如何应用程序都将变得无响应。

队列实际上是一种情况,您可以在其中不使用互斥锁。例如,Mac OS X(可能还有 iOS)提供了 OSAtomicEnqueue()OSAtomicDequeue()函数(参见 man atomic<libkern/OSAtomic.h> )利用特定于处理器的原子操作来避免使用锁。

但是,为什么不把主线程上的事件作为主运行循环的一部分来处理呢?

关于multithreading - 互斥锁 : what does "blocking" mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982501/

相关文章:

ruby-on-rails - 线程安全的 Rails Controller 操作 - 设置实例变量?

编译线程程序

C++:具有 `std::lock_guard` 的互斥量是否足以同步两个 `std::thread`?

ios - NSoperationQueue阻塞主线程

iphone - NSLock 实例应该是 "global"吗?

linux - 语法上更简单的 flock 调用

C++ 锁定后读取文件

c++ - 通过const引用传递shared_ptr是线程安全的吗?

c++ - 线程安全无锁数组

c++ - Long Atomic Int 的实现