当一个线程试图访问一个互斥锁资源时会发生啥?

Posted

技术标签:

【中文标题】当一个线程试图访问一个互斥锁资源时会发生啥?【英文标题】:What happens when a thread attempts to access a mutex-locked resource?当一个线程试图访问一个互斥锁资源时会发生什么? 【发布时间】:2011-08-11 19:52:31 【问题描述】:

我目前正在创建一个 SDL/OpenGL 程序,它根据一些状态变量呈现对象。这些状态变量在单独的线程中以用户定义的速率连续更新。每隔一段时间,主线程就需要异步交换其中一些状态变量。

现在,这些状态变量大多是指针,所以当我从主线程更新它们时(即相对于更新线程异步),我首先创建一个互斥锁,删除对象,创建/交换它们到新的的,然后解锁互斥锁。不过,在此期间更新线程仍在运行。

由于最后一点,我很好奇。如果线程试图在异步更新中访问这些状态变量中的任何一个会发生什么?我知道这不是允许的(由于互斥锁),但是幕后会发生什么?

【问题讨论】:

【参考方案1】:

除非您使用互斥锁和解锁来覆盖您的更新代码,否则更新线程(您的最后一点)不会关心主线程的锁定。它只会更新该数据。

在更新变量之前,您应该在更新线程上使用相同的互斥对象(只需在更新线程和主线程的生命周期内创建它)。这样,当更新线程正在访问时,主线程将无法访问该数据,反之亦然。

您可能想好好看看互斥锁是如何用于线程同步的。

更新:针对您的问题

“所以基本上,只要我有一个线程不安全的变量,我应该用相同的互斥锁包围对该变量的所有访问?”

是的,但您还应该注意可能发生死锁的情况。死锁是许多应用程序中避免使用多线程的主要原因,或者换句话说,很多人不喜欢多线程。

【讨论】:

我已经为异步更新使用了一个全局互斥锁,这样就可以了。我想我现在明白互斥对象是如何工作的了,我认为它们是“设置这个,线程处理程序将处理其余的”类型的东西。 所以基本上,只要我有一个线程不安全的变量,我应该用相同的互斥体包围对该变量的所有访问?

以上是关于当一个线程试图访问一个互斥锁资源时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

多个线程试图锁定

Java并发编程:使用synchronized获取互斥锁的几点说明

多线程之线程同步(互斥锁信号量条件变量和读写锁​)

多线程之线程同步(互斥锁信号量条件变量和读写锁​)

多线程之线程同步(互斥锁信号量条件变量和读写锁​)

互斥锁