21xrx.com
2024-09-19 09:37:10 Thursday
登录
文章检索 我的文章 写文章
C++ 多线程(Thread)
2023-07-11 19:10:07 深夜i     --     --
C++ 多线程 Thread 并发编程 线程安全

C++作为一种高级编程语言,拥有许多强大的编程功能。其中,多线程(Thread)就是其中之一。多线程是指在一个进程内有多个线程同时存在,每一个线程都可以独立执行不同的操作。因此使用多线程技术可以提高程序的运行效率和响应速度。

C++多线程的使用可以分为三个步骤:创建线程、线程处理和线程结束。首先需要创建一个线程来执行任务。可以通过C++11中的std::thread类来创建线程对象,如下所示:


#include <thread>

void ThreadFunc()

  // do something

int main()

{

  std::thread th(ThreadFunc); // 创建线程,并指定线程的处理函数

  th.join(); // 等待线程结束

  return 0;

}

在这个例子中,创建了一个函数ThreadFunc()来作为线程的处理函数,然后使用std::thread类的构造函数来创建了一个线程对象th,并将这个函数作为参数传递给了它。最后调用线程对象的join()方法等待线程结束。

由于多个线程同时在执行,因此需要考虑线程间的同步问题。如果多个线程同时对同一资源进行读写,就会出现竞态条件(Race Condition),导致程序运行错误。为了避免这种情况,C++提供了一些同步机制,例如互斥锁(Mutex)和条件变量(Condition Variable)等。互斥锁可以保证同时只有一个线程可以访问共享资源,而条件变量可以用来协调线程之间的动作。


#include <mutex>

#include <condition_variable>

#include <vector>

std::mutex g_mutex;

std::condition_variable g_cond;

std::vector<int> g_data;

void ThreadFunc1()

{

  // 新加入数据

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

    std::lock_guard<std::mutex> guard(g_mutex); // 加锁

    g_data.push_back(i);

    g_cond.notify_one(); // 唤醒等待的线程

  }

}

void ThreadFunc2()

{

  // 取出数据并打印

  while (true) {

    std::unique_lock<std::mutex> locker(g_mutex); // 加锁

    while (g_data.empty()) {

      g_cond.wait(locker); // 等待条件满足

    }

    int val = g_data.back();

    g_data.pop_back();

    locker.unlock(); // 解锁

    printf("[%s] get value %d\n", __FUNCTION__, val);

  }

}

int main()

{

  std::thread th1(ThreadFunc1);

  std::thread th2(ThreadFunc2);

  th1.join();

  th2.join();

  return 0;

}

在这个例子中,ThreadFunc1()函数向std::vector容器中添加数据,添加完成后使用std::condition_variable类的notify_one()方法唤醒等待的线程。ThreadFunc2()函数从std::vector容器中取出数据,并进行打印。当容器为空时,使用std::condition_variable类的wait()方法等待线程条件满足。

总的来说,C++多线程技术为大家提供了一个快速解决并发问题的途径,同时也提高了程序的运行效率和处理速度。C++11标准化了多线程的实现,使得使用起来更加简单、高效和安全。因此,使用C++多线程技术来实现并发程序,可以让程序的运行更加稳定和可靠。

  
  

评论区

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