21xrx.com
2024-09-19 09:38:58 Thursday
登录
文章检索 我的文章 写文章
C++多线程的实现方法
2023-07-04 22:29:44 深夜i     --     --
C++ 多线程 实现方法

C++是一种广泛使用的编程语言,它拥有良好的多线程支持,可以让程序在不同的线程中同时执行多个任务,从而提高程序的性能和响应速度。如果您想掌握C++多线程的实现方法,下面是一些需要了解的基本概念和技术。

1. 线程和进程

线程是指程序中一个可独立执行的指令序列,它可以和其他线程共享进程的资源。一个进程可以包含多个线程,每个线程都有自己的线程栈、寄存器、程序计数器和其他相关数据。进程是指操作系统中一个正在运行的程序,它拥有自己的内存空间、文件句柄、进程标识符等系统资源。

2. 创建和启动线程

在C++标准库中,可以使用` `头文件来创建和启动线程。下面是一个简单的例子,它创建了两个线程,并在每个线程中执行不同的功能。


#include <iostream>

#include <thread>

using namespace std;

void threadFunction1() {

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

    cout << "Thread 1 executing..." << endl;

  

}

void threadFunction2(int n) {

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

    cout << "Thread 2 executing..." << endl;

  

}

int main() {

  thread t1(threadFunction1);

  thread t2(threadFunction2, 3);

  t1.join();

  t2.join();

  cout << "All threads completed." << endl;

  return 0;

}

在上面的例子中,`threadFunction1()`和`threadFunction2(int n)`是两个线程执行的函数。`thread t1(threadFunction1)`创建一个线程t1,并在其中执行函数`threadFunction1()`。`thread t2(threadFunction2, 3)`创建另一个线程t2,并在其中执行函数`threadFunction2(3)`,参数3指定了该线程执行的次数。

注意在最后必须要等待所有线程执行完毕,这里使用了`join()`函数来等待线程执行完成。如果不调用`join()`,则程序会直接结束,可能导致线程无法正常执行。

3. 互斥锁

多个线程共享进程的资源时,可能会引发数据竞争问题。为了避免这种问题,需要使用互斥锁来控制对共享资源的访问。互斥锁是一种同步机制,它可以保证在同一时间只有一个线程能够访问共享资源。下面是一个使用互斥锁的例子。


#include <iostream>

#include <thread>

#include <mutex>

using namespace std;

int counter = 0;

mutex mtx;

void incrementCounter() {

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

    mtx.lock();

    counter++;

    mtx.unlock();

  }

}

int main() {

  thread t1(incrementCounter);

  thread t2(incrementCounter);

  t1.join();

  t2.join();

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

  return 0;

}

在上面的例子中,`counter`是一个共享资源,可以被多个线程同时访问。 `mtx`是一个互斥锁,用于控制对`counter`的访问。 在`incrementCounter()`函数中,线程首先通过调用`mtx.lock()`来获取互斥锁,然后递增`counter`的值,最后通过调用`mtx.unlock()`来释放互斥锁。

4. 条件变量

条件变量是一种同步机制,它可以使一个或多个线程等待一个特定的条件,直到某个线程通知这个条件已经成立。条件变量常用于线程之间的通信和协作。下面是一个使用条件变量的例子。


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

using namespace std;

int counter = 0;

mutex mtx;

condition_variable cv;

void incrementCounter() {

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

    mtx.lock();

    counter++;

    if(counter == 50) {

      cv.notify_one();

    }

    mtx.unlock();

  }

}

int main() {

  thread t1(incrementCounter);

  unique_lock<mutex> lck(mtx);

  cv.wait(lck, []{return counter == 50;});

  lck.unlock();

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

  t1.join();

  return 0;

}

在上面的例子中,`incrementCounter()`函数执行时会递增`counter`的值。当`counter`达到50时,会调用`cv.notify_one()`来通知一个等待条件变量的线程。 在`main()`函数中,首先创建线程`t1`并启动,然后通过`unique_lock lck(mtx)`来获取互斥锁,并等待条件变量`cv`的成立。在等待期间,线程将释放互斥锁。`cv.wait(lck, []{return counter == 50;})`会不停地检查`counter`的值是否为50,直到满足条件为止。当条件成立时,线程获取互斥锁并输出`counter`的值。然后,等待线程`t1`执行完毕,最后结束程序。

总之,C++多线程编程需要掌握线程创建和启动、互斥锁和条件变量等技术,能够避免数据竞争问题,实现线程间的同步和通信,提高程序的执行效率。

  
  

评论区

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