21xrx.com
2024-12-22 17:20:11 Sunday
登录
文章检索 我的文章 写文章
C++11线程通信
2023-07-05 04:28:57 深夜i     --     --
C++11 线程 通信

C++11引入了一些新的多线程特性,包括原子类型、互斥锁和条件变量等。这些特性可以用来实现线程之间的通信,使得多线程编程更加容易和可靠。

互斥锁可以用来保护共享资源,从而避免多个线程同时访问同一个变量或数据结构。在C++11中,使用std::mutex类型表示互斥锁。通过调用lock()和unlock()方法来控制对共享资源的访问。

C++11还引入了原子类型,它们可以用来实现无锁同步。原子类型的操作是原子性的,这意味着它们不会被打断。这是通过硬件级别的原子指令来实现的,因此可以避免使用互斥锁时的开销和竞争条件。

条件变量是另一个非常有用的多线程特性,它可以用于在线程之间传递信号和数据。条件变量由std::condition_variable类型表示。线程可以通过调用wait()方法来等待条件变量被唤醒,或者通过调用notify_one()或notify_all()方法来通知等待线程。

下面是一个使用互斥锁和条件变量来实现线程通信的例子:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mtx;

std::condition_variable cv;

bool ready = false;

int data = 0;

void producer()

{

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

  data = 42;

  ready = true;

  cv.notify_one();

}

void consumer()

{

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

  cv.wait(lck, []{return ready;});

  std::cout << "The answer is " << data << std::endl;

}

int main()

{

  std::thread t1(producer);

  std::thread t2(consumer);

  t1.join();

  t2.join();

}

在这个例子中,producer()函数将数据存储到共享变量data中,并设置ready标志。然后它通知等待线程通过调用cv.notify_one()。consumer()函数等待这个信号,直到ready标志被设置为true。一旦这个标志变为true,它就会获取互斥锁,读取data的值,并打印出来。

总结一下,C++11为多线程编程引入了许多新特性,包括原子类型、互斥锁和条件变量。这些特性可以用来实现线程之间的通信,从而使得多线程编程更加容易和可靠。在应用这些特性时,需要注意避免竞争条件和死锁等问题。

  
  

评论区

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