21xrx.com
2024-12-22 18:29:10 Sunday
登录
文章检索 我的文章 写文章
C++线程同步代码示例
2023-07-11 03:44:18 深夜i     --     --
C++ 线程 同步 代码 示例

在C++中,线程同步是一个非常重要的概念。当多个线程同时访问同一共享的资源时,很容易出现数据竞争和其他的问题。为了避免这种情况发生,需要使用一些线程同步的技术。

下面我们来介绍一下C++中的几种线程同步代码示例。

1. 互斥锁

使用互斥锁可以保证一段代码同一时间只能被一个线程访问,从而避免数据竞争的问题。互斥锁可以使用std::mutex来创建和管理。

下面是一个互斥锁的示例代码:


std::mutex m_mutex;

void foo()

{

  std::lock_guard<std::mutex> guard(m_mutex);

  // 在这里执行需要保护的代码

}

在这个示例中,我们首先创建了一个std::mutex对象来管理互斥锁。然后在需要同步的代码中,我们使用std::lock_guard来锁定互斥锁。这样就能保证只有一个线程可以执行这段被保护的代码。

2. 条件变量

条件变量是一种用于线程间通信的机制,它可以协调多个线程的执行。当某个线程等待特定条件满足时,可以使用条件变量来通知其他线程。

下面是一个条件变量的示例代码:


std::mutex m_mutex;

std::condition_variable m_cond;

void foo()

{

  std::unique_lock<std::mutex> lock(m_mutex);

  // 等待条件变量

  m_cond.wait(lock, [](){return (some_condition);});

  // 在这里执行需要保护的代码

}

在这个示例中,我们首先创建了一个std::condition_variable对象来管理条件变量。然后在需要等待条件的代码中,我们使用std::unique_lock来锁定互斥锁,并使用m_cond.wait()等待条件变量。当条件变量被其他线程触发时,等待的线程就会继续执行。

3. 原子变量

原子变量是一种能够保证线程安全的变量类型。当多个线程同时访问同一原子变量时,可以保证它的值不会出现不一致的情况。

下面是一个原子变量的示例代码:


std::atomic<int> m_atomic(0);

void foo()

{

  m_atomic.fetch_add(1);

}

在这个示例中,我们首先创建了一个std::atomic类型的变量m_atomic,并初始化为0。然后在需要修改这个变量的代码中,我们使用m_atomic.fetch_add()原子操作来增加它的值。在多个线程同时访问m_atomic时,可以保证它的值不会出现不一致的情况。

总结

在C++中,线程同步是一个非常重要的概念,可以使用互斥锁、条件变量和原子变量等技术来解决多线程访问共享资源的问题。在编写多线程程序时要牢记这些概念,以确保程序的正确性和可靠性。

  
  

评论区

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