std::atomic_bool proceed(false);
std::mutex m;
std::condition_variable cv;
std::thread t([&m,&cv,&proceed]()
{
{
std::unique_lock<std::mutex> l(m);
while(!proceed) {
hardWork();
cv.wait(l);
}
}
});
proceed = true;
{
std::lock_guard<std::mutex> lock(m);
}
cv.notify_one();
t.join();
我知道互斥体通常也会保护共享数据,使用原子变量只是一个例子。问题不是如何保护共享数据,而是是否需要使用相同的互斥体来保护两者。另一个使用第二互斥体的示例:
bool proceed(false);
std::mutex boolMutex;
std::mutex cvMutex;
std::condition_variable cv;
std::unique_lock<std::mutex> l(cvMutex);
void setBool()
{
std::lock_guard<std::mutex> lock(boolMutex);
proceed = true;
}
bool checkBool()
{
std::lock_guard<std::mutex> lock(boolMutex);
return proceed;
}
void worker()
{
while (true)
{
cv.wait(l);
if (checkBool()) {
// Do work
return;
}
}
}
int main()
{
std::thread t(worker);
setBool();
{
std::lock_guard<std::mutex> lock(cvMutex);
}
cv.notify_one();
t.join();
return 0;
}
必须设置互斥保护标志,并在互斥仍被保持时通知条件变量get:
{
std::lock_guard<std::mutex> lock(m);
proceed = true;
cv.notify_one();
}
此外,在本例中,proceed
标志不需要是原子实体。一个简单的
bool proceed;
就足够了。由于对proceed
的访问仅在持有相关互斥体的情况下发生,使proceed
原子化完全没有实现任何事情。
当程序中有共享数据,肯定不想让其陷入条件竞争,或是不变量被破坏。那么,将所有访问共享数据结构的代码都标记为互斥岂不是更好?这样任何一个线程在执行这些代码时,其他任何线程试图访问共享数据结构,就必须等到那一段代码执行结束。于是,一个线程就不可能会看到被破坏的不变量,除非它本身就是修改共享数据的线程。 当访问共享数据前,使用互斥量将相关数据锁住,再当访问结束后,再将数据解锁。线程库需要保证,当一个线程
问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为
我正在阅读n3485中定义的C内存模型,它讨论了释放/获取语义,根据我的理解,以及本博客中给出的定义: Acquire语义是一个属性,它只能应用于从共享内存读取的操作,无论是读-修改-写操作还是普通加载。然后,该操作被视为读取获取。Acquire语义可以防止读Acquire的内存重新排序,并按照程序顺序执行读或写操作。 释放语义学是一个属性,它只适用于写入共享内存的操作,无论它们是读-修改-写操作
互斥是多线程系统中用于控制访问的一个原对象(primitive object)。下面的例子给出了它最基本的用法: std::mutex m; int sh; //共享数据 // … m.lock(); // 对共享数据进行操作: sh += 1; m.unlock(); 在任何时刻,最多只能有一个线程执行到lock()和unlock()之间的区域(通常称为临界区)。当第一个线程正在临界区执行时
Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor
上面的例子中,我们看过了如何在多个协程之间原子地访问计数器,对于更复杂的例子,我们可以使用Mutex来在多个协程之间安全地访问数据。 package main import ( "fmt" "math/rand" "runtime" "sync" "sync/atomic" "time" ) func main() { // 这个例子的状态就