c++多个线程函数对同一变量操作,如何枷锁
每个线程用不同的线程函数
例如:
std::mutex mutex_;
void func1()
{
std::cout << "func1" << std::endl;
std::lock_guard<std::mutex> lck(mutex_);
std::this_thread::sleep_for(std::chrono::seconds(7));
std::cout << "func1 end" << std::endl;
}
void func2()
{
std::cout << "func2" << std::endl;
std::lock_guard<std::mutex> lck(mutex_);
std::cout << "func2 coming" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "func2 end" << std::endl;
}
int main()
{
std::thread t1(func1);
std::this_thread::sleep_for(std::chrono::seconds(2));
std::thread t2(func2);
std::this_thread::sleep_for(std::chrono::seconds(15));
}
由于我们在定义t1线程后,休眠了2秒,则基本可以保证:func1函数 执行到定义锁且到了睡眠7秒的地方了,此时线程2才开始,
由于线程1先获取到锁且睡眠7秒,因此:线程2必须等7秒后才能输出 func2 coming

多个线程公用一个线程函数
int counter = 0;
void increase(int count) {
for (size_t i = 0; i < count; i++)
{
/*std::lock_guard<std::mutex> lck(mutex_);*/
std::this_thread::sleep_for(std::chrono::milliseconds(1));
counter++;
}
}测试:std::thread t1(increase, 5000);
std::thread t2(increase, 5000);
t1.join();
t2.join();
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "counter:" << counter << std::endl;结果:counter值并不是10000,说明了2个线程函数执行时有对同counter变量修改存在问题,执行3次结果都不同:



于是:通过枷锁,来实现互斥访问:
for (size_t i = 0; i < count; i++)
{
std::lock_guard<std::mutex> lck(mutex_);
std::this_thread::sleep_for(std::chrono::milliseconds(1));
counter++;
}执行3次结果如下,均为10000:



当然了,也可以在2个线程函数里执行,枷锁后效果一样的。