21xrx.com
2024-11-05 20:26:28 Tuesday
登录
文章检索 我的文章 写文章
C++ 多线程 join:如何等待并发线程完成?
2023-07-05 05:58:49 深夜i     --     --
C++ 多线程 join 等待 并发线程

C++是一种高级编程语言,常常用于开发高性能的程序。在充分利用多核处理器的时代,使用多线程执行程序的能力非常重要。使用C++11引入的多线程库,我们可以在C++程序中轻松地创建和管理多个线程。

然而,当我们使用多线程执行一些任务时,我们需要等待所有的线程完成,才能继续程序的执行。这就是join()函数的作用。join()函数可以等待一个线程完成后,再继续执行其他代码。下面是一个简单的例子:


#include <iostream>

#include <thread>

void thread_func()

  std::cout << "Thread function executing..." << std::endl;

int main() {

  std::thread t(thread_func);

  std::cout << "Main thread executing..." << std::endl;

  t.join();

  std::cout << "Main thread after join." << std::endl;

  return 0;

}

在上面的例子中,我们创建了一个新线程,并让它执行thread_func()函数。然后,我们在主线程中打印一条消息。因为我们使用了join()函数,所以主线程将等待新线程执行完成。当新线程执行完毕后,它将被合并回主线程,并打印一条消息表示程序执行完成。

除了join()函数以外,还有一种方法可以实现等待多个线程完成。这就是使用条件变量。条件变量用于线程间的同步,在某个条件达成之前,线程可以等待在条件变量上。当条件变量满足时,线程继续执行。使用条件变量时,我们需要使用一个锁,以避免不同的线程同时访问共享变量。下面是一个简单的例子:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mtx;

std::condition_variable cv;

bool done = false;

void thread_func() {

  std::cout << "Thread function executing..." << std::endl;

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

  done = true;

  cv.notify_all();

}

int main() {

  std::thread t(thread_func);

  std::cout << "Main thread executing..." << std::endl;

  {

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

    cv.wait(lock, []{return done;});

  }

  std::cout << "Main thread after wait." << std::endl;

  t.join();

  return 0;

}

在上面的例子中,我们使用了条件变量和互斥锁来同步线程。在新线程执行完毕后,它会设置done变量的值,并通过notify_all()函数告知其他线程条件已经满足。在主线程中,我们等待done变量的值为true。如果done变量的值为false,那么主线程将会进入等待状态。当新线程设置done变量的值为true时,主线程将被唤醒,并继续执行。最后,我们使用join()函数等待新线程执行完成。

总的来说,join()函数是C++中一个非常有用的函数,它允许我们等待一个或多个线程完成后,再继续程序的执行。除了join()函数以外,我们还可以使用条件变量和互斥锁来同步线程的执行。当我们需要等待多个线程完成时,使用条件变量可能更加合适。无论使用哪种方法,都需要小心处理线程之间的同步,以避免发生竞态条件和死锁等问题。

  
  

评论区

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