Kam*_*mal 4 c++ multithreading boost
我编写了以下程序,用于使用增强条件变量来交替增加和加倍计数器(增量优先).任何人都能告诉我这是否正确使用了增强条件变量.它工作正常.我不明白在wait函数调用中使用lock.condition.wait(lock)是什么意思?例如,在此程序中增量和乘法使用两个范围锁是什么.我该如何避免它们?
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <boost/thread/locks.hpp>
#include <boost/thread/condition_variable.hpp>
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int counter=0;
boost::mutex m1,m2;
bool incremented=false,multiplied=false;
boost::condition_variable c1,c2;
void Increment()
{
{
boost::mutex::scoped_lock lk(m1);
counter++;
incremented = true;
c1.notify_one();
while(!multiplied)
c2.wait(lk);
multiplied=false;
}
}
void Multiply()
{
{
boost::mutex::scoped_lock lk(m2);
while(!incremented)
c1.wait(lk);
incremented = false;
counter = counter*2 ;
multiplied = true;
c2.notify_one();
}
}
void IncrementNtimes(int n){
for(int i=0;i<n;i++){
Increment();
}
}
void MultiplyNtimes(int n){
for(int i=0;i<n;i++){
Multiply();
}
}
int main(int argc, char* argv[])
{
srand ( time(NULL) );
boost::thread thrd1(boost::bind(&IncrementNtimes,20));
boost::thread thrd2(boost::bind(&MultiplyNtimes,20));
thrd1.join();
thrd2.join();
cout<<"Main counter is:"<<counter<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Tyl*_*nry 18
不,这不正确.你几乎就在那里,但最大的问题是Multiply和Increment函数应该使用相同的互斥锁.
互斥锁是一个提供MUTual EXclusion的对象.换句话说,互斥锁的要点是防止两个线程同时触及同一个变量并导致不可预测的结果.互斥体有点像一个线程,一次持有一个线程,使其具有访问某个变量(或一组变量)的"权利".在这种情况下,您要保护的变量是counter.必须有一个且只有一个互斥锁控制访问权限counter.在您的情况下,每个线程将拥有自己的令牌,它认为它具有访问计数器的权限,因此会出现不可预测的行为.
通过锁定它来"保持"互斥锁.这就是锁的重点,这就是为什么你不能"避免"它们.范围锁的整个点是,假设您只有一个互斥锁m,当其中一个线程持有锁时m,另一个线程保证也不会持有锁m.如果您已正确编码,则持有锁m应该是访问的先决条件counter,因此值counter应该是可预测的.
现在,关于wait().打电话wait()意味着"我放弃对这个互斥锁的锁定,直到有人发出这种情况为止,然后我想要它回来".同时,线程停止.因此,假设你只有一个互斥体m和条件c,并且lk是在一个锁m,行c.wait(lk)意味着该线程将放弃锁lk在m后停止执行,直到其他线程调用c.notify_one()(或c.notify_all()).当从呼叫等待线程返回wait(),它都将自动重新获得了锁lk的m,因此被允许访问counter一次.
最后,这些增强锁是"范围"锁.这意味着它们会在销毁时自动释放(当它们超出范围时).因此,在这种情况下,每个函数都会保持锁定直到它退出,除非它已经放弃锁定等待并暂停执行等待信号.
| 归档时间: |
|
| 查看次数: |
12594 次 |
| 最近记录: |