C线程库thread是C11中新增的一个标准库,该库提供了一种简单的方式来创建和管理多线程。thread库包含了一些线程相关的类和函数,它能够让程序员更容易地使用多线程,从而实现并发计算,提高程序的性能。
创建线程
C++线程库thread提供了一个thread类,用于创建和管理线程。使用thread类的构造函数创建线程,传递函数指针和需要的参数,就可以创建并启动一个新的线程。
#include <thread>
#include <iostream>
void myFunction(int i) {
std::cout << "Thread ID: " << std::this_thread::get_id() << " Parameters: " << i << std::endl;
}
int main() {
std::thread t(myFunction, 1);
t.join(); // 等待线程结束
return 0;
}
在上面的示例代码中,我们定义了一个名为myFunction的函数,函数只有一个参数i。然后我们使用std::thread类的构造函数创建一个线程对象t,并将myFunction以及需要的参数1传递给它。最后,我们使用join()函数等待线程t结束。
线程同步
在线程操作中,数据的安全访问是一个关键问题。线程同步用于确保线程正确地读写共享资源。C++线程库thread提供了一些同步机制来帮助实现线程同步:
Mutex(互斥量):当一个线程占用一个互斥量时,其他线程无法访问该互斥量,并阻塞等待。
Condition Variable(条件变量):用于线程之间的通信,当一个线程等待一个条件变量时,它将被阻塞,并等待另一个线程唤醒它。
Atomic(原子变量):使用原子操作实现对变量的原子修改,保证多线程之间的数据同步。
下面是使用互斥量和条件变量实现线程同步的示例:
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
std::mutex mtx; // 互斥量
std::condition_variable cv; // 条件变量
bool flag = false; // 全局变量
void myFunction() {
std::unique_lock<std::mutex> ul(mtx);
while (!flag) {
cv.wait(ul); // 等待条件变量
}
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}
int main() {
std::thread t1(myFunction);
std::thread t2(myFunction);
// 此处进行一些操作...
{
std::lock_guard<std::mutex> lg(mtx);
flag = true; // 修改共享变量
cv.notify_all(); // 唤醒等待条件变量的线程
}
t1.join();
t2.join();
return 0;
}
在上面的示例代码中,我们使用了互斥量和条件变量来实现线程同步。创建了两个线程t1和t2,在t1和t2线程中等待条件变量flag。在主线程中修改flag后,使用notify_all()函数唤醒等待条件变量的线程。
线程的控制
C++线程库thread还提供了一些有用的函数来控制线程的状态和行为。这些函数包括:
join():等待线程执行结束,线程的资源随之释放。
detach():将线程“分离”出来,使其成为独立于主线程的一个线程,其资源由系统自动释放。
get_id():获取线程ID。
yield():将当前线程从运行状态移出,允许其他线程运行。
下面是一个示例,演示如何使用detach()函数来分离线程:
#include <thread>
#include <iostream>
void myFunction() {
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}
int main() {
std::thread t(myFunction);
t.detach(); // 分离线程
// 由于线程被分离,程序直接结束,不等待线程结束
return 0;
}
在上面的示例中,我们创建了一个线程t,并使用detach()函数将该线程分离出来,程序直接结束,线程t后台运行,线程的资源由系统自动释放。
总之,C++线程库thread是一个非常实用的工具,能够帮助程序员更方便地实现多线程编程。掌握了thread库的基本用法,可以让我们在编写高效的并发程序时更加得心应手。