我是一名有用的助手,能够翻译文本。
我正在学习关于C++11并发编程,我的唯一先前的并发原语经验是在六年前的操作系统课程中,所以如果可以请温柔些。
在C++11中,我们可以写:
这个方案很好,但我对需要将
现在,我相信`unique_lock`的一个很酷的特性是我们可以传递它,对吧?因此,如果我们能这样做,那将非常优雅:
现在,秃鹫线程无法介入,因为互斥锁从"I MADE YOU A COOKIE"一直保持锁定状态到"YUM"。另外,如果notify()需要传递一个锁,那么这是确保人们在调用notify()之前实际上锁定了互斥锁的好方法(参见Signalling a condition variable (pthreads))。
我相信C++11没有这种惯用语的任何标准实现。这背后的历史原因是什么(仅仅是pthread没有做吗?然后为什么是那样的)?有没有技术原因,一个冒险的C++编码者不能在标准C++11中实现这种惯用语,称它为my_better_condition_variable?
我还有一种模糊的感觉,也许我正在重新发明信号量,但我不记得学校里的东西是否准确。
我正在学习关于C++11并发编程,我的唯一先前的并发原语经验是在六年前的操作系统课程中,所以如果可以请温柔些。
在C++11中,我们可以写:
std::mutex m;
std::condition_variable cv;
std::queue<int> q;
void producer_thread() {
std::unique_lock<std::mutex> lock(m);
q.push(42);
cv.notify_one();
}
void consumer_thread() {
std::unique_lock<std::mutex> lock(m);
while (q.empty()) {
cv.wait(lock);
}
q.pop();
}
这个方案很好,但我对需要将
cv.wait
包含在一个循环中感到不满。我们需要循环的原因对我来说很清楚:Consumer (inside wait()) Producer Vulture
release the lock
sleep until notified
acquire the lock
I MADE YOU A COOKIE
notify Consumer
release the lock
acquire the lock
NOM NOM NOM
release the lock
acquire the lock
return from wait()
HEY WHERE'S MY COOKIE I EATED IT
现在,我相信`unique_lock`的一个很酷的特性是我们可以传递它,对吧?因此,如果我们能这样做,那将非常优雅:
Consumer (inside wait()) Producer
release the lock
sleep until notified
acquire the lock
I MADE YOU A COOKIE
notify and yield(passing the lock)
wake(receiving the lock)
return from wait()
YUM
release the lock
现在,秃鹫线程无法介入,因为互斥锁从"I MADE YOU A COOKIE"一直保持锁定状态到"YUM"。另外,如果notify()需要传递一个锁,那么这是确保人们在调用notify()之前实际上锁定了互斥锁的好方法(参见Signalling a condition variable (pthreads))。
我相信C++11没有这种惯用语的任何标准实现。这背后的历史原因是什么(仅仅是pthread没有做吗?然后为什么是那样的)?有没有技术原因,一个冒险的C++编码者不能在标准C++11中实现这种惯用语,称它为my_better_condition_variable?
我还有一种模糊的感觉,也许我正在重新发明信号量,但我不记得学校里的东西是否准确。