21xrx.com
2024-11-22 03:31:30 Friday
登录
文章检索 我的文章 写文章
C++多线程同步修改同一变量
2023-07-11 05:55:24 深夜i     --     --
C++ 多线程 同步 修改 变量

在 C++ 编程中,多线程同步修改同一变量是一个常见的问题。如果多个线程同时对同一变量进行操作,那么就可能会导致竞争条件或死锁问题,从而影响程序的正确性和性能。因此,需要使用同步机制来保证多线程程序的正确性。

下面介绍一些常用的同步机制:

1. 互斥锁

互斥锁(mutex)是一种最简单和常见的同步机制。它是一个二进制信号量,用于控制对共享资源的访问。当一个线程请求获取互斥锁时,如果锁已经被另一个线程占用,则该线程会被阻塞,直到占用锁的线程释放锁。一旦一个线程获得了互斥锁,它就可以访问共享资源,并且其他线程将无法访问该资源,直到该线程释放互斥锁。

例如,可以使用 std::mutex 类来创建互斥锁。下面是一个简单的示例代码:


#include <iostream>

#include <mutex>

#include <thread>

std::mutex mtx;

int count = 0;

void increment_counter() {

 mtx.lock();

 count++;

 std::cout << "Counter value: " << count << std::endl;

 mtx.unlock();

}

int main() {

 std::thread t1(increment_counter);

 std::thread t2(increment_counter);

 

 t1.join();

 t2.join();

 

 return 0;

}

在该示例中,定义了一个全局的互斥锁 mtx,和一个共享变量 count。increment_counter 函数中,先通过 mtx.lock() 获得互斥锁,然后对 count 进行自增操作,并输出结果。最后使用 mtx.unlock() 释放互斥锁。

在主函数中,创建两个线程 t1 和 t2 分别执行 increment_counter 函数。由于互斥锁的使用,每次只有一个线程能够对 count 进行自增操作,输出的结果也是按照顺序递增的。

2. 条件变量

条件变量(condition variable)是一种高级的同步机制,用于等待和通知线程状态的改变。当多个线程需要等待某个条件成立时,可以使用条件变量进行同步;当条件成立时,通过条件变量通知等待的线程。

例如,可以使用 std::condition_variable 类来定义条件变量。下面是一个简单的示例代码:


#include <iostream>

#include <condition_variable>

#include <mutex>

#include <thread>

std::mutex mtx;

std::condition_variable cv;

int count = 0;

void increment_counter() {

 std::unique_lock<std::mutex> lck(mtx);

 count++;

 std::cout << "Counter value: " << count << std::endl;

 cv.notify_all();

}

void wait_for_counter(int target_count) {

 std::unique_lock<std::mutex> lck(mtx);

 cv.wait(lck, [&]() { return (count >= target_count); });

 std::cout << "Target count reached: " << count << std::endl;

}

int main() {

 std::thread t1(wait_for_counter, 5);

 std::thread t2(wait_for_counter, 10);

 std::this_thread::sleep_for(std::chrono::seconds(1));

 increment_counter();

 t1.join();

 t2.join();

 return 0;

}

在该示例中,定义了一个条件变量 cv,和一个共享变量 count。increment_counter 函数中,对 count 进行自增操作,并输出结果。wait_for_counter 函数中,首先获得互斥锁 mtx,然后使用 cv.wait() 等待条件成立,条件是 count 大于等于目标值 target_count。当条件成立时,cv.wait() 函数就会返回,并输出 "Target count reached: "。

在主函数中,创建两个线程 t1 和 t2 分别执行 wait_for_counter 函数,等待 count 值达到目标值。由于使用了条件变量的等待和通知机制,当 increment_counter 函数自增 count 值后,就会通知等待的线程,执行 wait_for_counter 函数中的逻辑。

总的来说,使用互斥锁和条件变量是 C++ 多线程编程中最基本和最常用的同步机制。在实际应用中可能还会用到信号量、读写锁、自旋锁等同步机制,需要根据具体的场景选择合适的同步机制。同时,需要注意同步机制的正确性和性能,在高并发场景下需要进行优化和测试。

  
  
下一篇: 体中文界面?

评论区

{{item['qq_nickname']}}
()
回复
回复