21xrx.com
2024-06-02 23:41:02 Sunday
登录
文章检索 我的文章 写文章
C++线程间通信实现方法
2023-07-12 01:36:04 深夜i     --     --
C++ 线程间通信 实现方法

在多线程编程中,线程间通信是非常重要的,常用的方法有几种,如共享内存、消息队列、信号量等,在C++中也有许多实现线程间通信的方式,下面将详细介绍一些常用的方法。

1.互斥锁

互斥锁是一种最常用的线程同步机制。互斥锁实现的是一段代码的互斥执行,即同一时间只能有一个线程访问该代码段。在C++中可以使用互斥锁类std::mutex和std::lock_guard来实现。

例如,我们可以用互斥锁来保护共享变量的访问:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex mut;

void print(int i) {

  std::lock_guard<std::mutex> lock(mut);

  std::cout << "Thread " << i << " is executing." << std::endl;

}

int main() {

  std::thread threads[10];

  for (int i = 0; i < 10; i++)

    threads[i] = std::thread(print, i);

  for (auto& t : threads)

    t.join();

  return 0;

}

输出结果:


Thread 0 is executing.

Thread 1 is executing.

Thread 2 is executing.

Thread 3 is executing.

Thread 4 is executing.

Thread 5 is executing.

Thread 6 is executing.

Thread 7 is executing.

Thread 8 is executing.

Thread 9 is executing.

可以看到,10个线程按顺序执行了互斥锁中的代码,实现了安全的线程间通信。

2.条件变量

条件变量是一种同步机制,它通过等待和通知的机制来阻塞和唤醒线程。在C++中,可以使用std::condition_variable类和std::unique_lock来实现条件变量。

例如,我们可以用条件变量来实现线程间的通信:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mut;

std::condition_variable cv;

bool flag = false;

void print(int i) {

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

  while (!flag)

    cv.wait(lock);

  std::cout << "Thread " << i << " is executing." << std::endl;

}

int main() {

  std::thread threads[10];

  for (int i = 0; i < 10; i++)

    threads[i] = std::thread(print, i);

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

  flag = true;

  cv.notify_all();

  for (auto& t : threads)

    t.join();

  return 0;

}

输出结果:


Thread 0 is executing.

Thread 1 is executing.

Thread 2 is executing.

Thread 3 is executing.

Thread 4 is executing.

Thread 5 is executing.

Thread 6 is executing.

Thread 7 is executing.

Thread 8 is executing.

Thread 9 is executing.

可以看到,10个线程在条件变量的帮助下按顺序执行,实现了线程间的通信。

3.原子操作

原子操作是指不可中断的操作,它们能够保证在多线程环境中访问共享数据的正确性。在C++中,C++11引入了一个新的原子库std::atomic,它提供了原子类型和原子操作。

例如,我们可以用原子变量来保护共享变量的访问:


#include <iostream>

#include <thread>

#include <atomic>

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

void add() {

  for (int i = 0; i < 10000; i++)

    ++counter;

}

void sub() {

  for (int i = 0; i < 10000; i++)

    --counter;

}

int main() {

  std::thread t1(add);

  std::thread t2(sub);

  t1.join();

  t2.join();

  std::cout << "Counter: " << counter << std::endl;

  return 0;

}

输出结果:


Counter: 0

可以看到,在使用原子变量的情况下,不需要使用互斥锁或条件变量,就可以避免多线程访问共享变量的竞争问题,提高了程序的性能。

总结:C++中提供了许多实现线程间通信的方式,我们可以根据实际需求选择合适的方法来解决问题,使程序更加健壮稳定。同时,在多线程编程中,还需要注意线程安全问题,尽量避免共享变量的访问竞争,保证程序的正确性和效率。

  
  

评论区

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