21xrx.com
2024-11-22 10:02:14 Friday
登录
文章检索 我的文章 写文章
C++11多线程编程介绍
2023-06-28 17:20:07 深夜i     --     --
C++11 多线程编程 介绍

C++11 多线程编程是在 C++11 语言标准中引入的一种特性,它使得并发编程更加容易。通过多线程编程,我们可以让计算机在同时运行多个线程的情况下,更加高效地完成任务。

C++11 多线程编程的基本概念包括线程、互斥锁、条件变量、原子操作等。其中,线程是 C++11 中最基本的多线程编程概念。通过 C++11 中提供的 std::thread 类,我们可以方便地创建新的线程。例如:


void my_thread_func()

  // 线程需要执行的逻辑

int main() {

  std::thread my_thread(my_thread_func);

  // main 线程继续执行其他逻辑

  my_thread.join();

  return 0;

}

在上面的例子中,我们首先定义了一个函数 my_thread_func(),这个函数将会在新线程中被执行。接着,我们通过 std::thread 创建了一个新的线程,并将 my_thread_func() 传递给该线程。在 main 函数中,我们可以继续执行其他逻辑。最后,我们使用 my_thread.join() 等待该线程执行完成。

在多线程编程中,我们需要考虑线程之间的同步问题。例如,多个线程同时访问共享的资源时可能会导致数据竞争的问题。为了避免这种问题,C++11 提供了互斥锁(即 std::mutex)和条件变量(即 std::condition_variable)等机制,可以实现线程之间的同步和协作。例如:


#include <mutex>

#include <condition_variable>

#include <queue>

std::mutex mtx;

std::condition_variable cv;

std::queue<int> q;

void producer() {

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

    {

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

      q.push(i);

    }

    cv.notify_one(); // 通知消费者线程

  }

}

void consumer() {

  while (true) {

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

    cv.wait(ulock, []{ return !q.empty(); }); // 等待队列不为空

    int val = q.front();

    q.pop();

    ulock.unlock();

    // 处理 val 的逻辑

  }

}

int main() {

  std::thread t1(producer), t2(consumer);

  t1.join();

  t2.join();

  return 0;

}

在上面的例子中,我们定义了一个生产者线程和一个消费者线程,它们共享一个队列 q,生产者会将元素压入队列,消费者会从队列中取出元素并进行处理。为了避免数据竞争,我们添加了互斥锁 mtx,并使用 std::lock_guard 对互斥锁进行自动加锁和解锁。为了使消费者能够在队列为空时等待,我们定义了一个条件变量 cv,并在消费者中使用 cv.wait() 等待生产者线程的通知。当生产者向队列中添加新元素时,它会通过 cv.notify_one() 通知消费者线程。这样,我们可以实现线程之间的同步和协作。

除了互斥锁和条件变量之外,C++11 还引入了原子操作机制(即 std::atomic),可以保证对共享变量的操作是原子的。例如:


#include <atomic>

std::atomic<int> counter;

void my_thread_func() {

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

    counter++;

  }

}

int main() {

  std::thread t1(my_thread_func), t2(my_thread_func);

  t1.join(); t2.join();

  std::cout << counter.load() << std::endl;

  return 0;

}

在上面的例子中,我们定义了一个全局变量 counter,并使用 std::atomic 进行定义。在 my_thread_func() 函数中,我们通过 counter++ 对 counter 进行累加操作。由于 std::atomic 提供了原子操作机制,因此我们不需要再使用互斥锁来保证线程安全。

总之,C++11 多线程编程是一项非常有用的技能,可以用于提高程序的性能和并发能力。通过使用 C++11 中提供的线程、互斥锁、条件变量、原子操作等特性,我们可以实现线程之间的同步和协作,避免数据竞争的问题。值得注意的是,在进行多线程编程时一定要谨慎编写,避免出现线程安全问题,以免造成程序崩溃或数据不一致等问题。

  
  

评论区

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