我目前正在创建一个SDL / OpenGL程序,它根据一些状态变量呈现对象。这些状态变量在单独的线程中以用户定义的速率连续更新。每隔一段时间,主线程异步需要交换一些状态变量。
现在,这些状态变量大多是指针,所以当我从主线程更新它们时(即与更新线程异步),我首先创建一个互斥锁,删除对象,创建/交换它们的新那些,然后解锁互斥锁。但同样,更新线程在此期间仍在运行。
由于最后一点,我很好奇。如果线程试图在异步更新中访问任何这些状态变量会发生什么?我知道这不是允许的(由于互斥锁),但是幕后会发生什么?
答案 0 :(得分:1)
除非您使用互斥锁和解锁来覆盖更新代码,否则更新线程(您的最后一点)将不关心主线程的锁定。它只会更新这些数据。
在更新变量之前,您应该在更新线程上使用相同的互斥对象(只在更新线程和主线程的生命周期中创建它)。这样,主线程在更新线程访问时将无法访问该数据,反之亦然。
您可能想要了解互斥体如何用于线程同步。
更新:为您的问题
“所以基本上,无论我在哪里都有一个线程不安全的变量,我应该使用相同的互斥锁包围对该变量的所有访问?”
是的,但您还应该了解可能发生死锁的情况。死锁是许多应用程序中避免多线程或以其他方式使用多线程的主要原因,很多人不喜欢多线程。