📅  最后修改于: 2023-12-03 14:59:49.563000             🧑  作者: Mango
C++是一种多线程编程语言,允许程序员在同一程序中运行多个线程并发的进行。
使用C++标准库的<thread>
头文件可以创建和管理线程。使用std::thread
类可以创建新线程并启动执行。
#include <iostream>
#include <thread>
// 定义线程函数
void thread_func()
{
for(int i = 0; i < 10; i++)
{
std::cout << "Thread function executing" << std::endl;
}
}
int main()
{
// 创建线程并启动执行
std::thread t(thread_func);
// 等待线程执行完成
t.join();
// 输出主线程结束
std::cout << "Main thread executed" << std::endl;
return 0;
}
使用std::thread
类创建线程,可以通过调用join()
方法等待线程执行完成。
也可以使用Lambda表达式来代替函数指针作为线程函数,使代码更加简洁。
#include <iostream>
#include <thread>
int main()
{
int data = 10;
// 创建线程并启动执行Lambda表达式
std::thread t([&data]()
{
for(int i = 0; i < 10; i++)
{
std::cout << "Thread function executing" << std::endl;
data--;
}
});
// 等待线程执行完成
t.join();
// 输出主线程结束和修改后的data值
std::cout << "Main thread executed" << std::endl;
std::cout << "data = " << data << std::endl;
return 0;
}
多线程并发执行时,需要考虑线程安全问题,避免数据竞争(Data Race)。
互斥锁是保证资源在多个线程之间互斥访问的一种机制。
#include <iostream>
#include <thread>
#include <mutex>
// 定义互斥锁
std::mutex m;
void thread_func()
{
// 对临界区进行保护
m.lock();
for(int i = 0; i < 10; i++)
{
std::cout << "Thread function executing" << std::endl;
}
m.unlock();
}
int main()
{
// 创建线程并启动执行
std::thread t(thread_func);
// 等待线程执行完成
t.join();
// 输出主线程结束
std::cout << "Main thread executed" << std::endl;
return 0;
}
条件变量是允许线程在某些条件得到满足时才执行的一种机制。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
// 定义互斥锁和条件变量
std::mutex m;
std::condition_variable cv;
int data = 0;
bool ready = false;
void thread_func()
{
std::unique_lock<std::mutex> lock(m);
while(!ready)
{
cv.wait(lock);
}
std::cout << "Thread function executing, data = " << data << std::endl;
}
int main()
{
// 创建线程并启动执行
std::thread t(thread_func);
{
std::unique_lock<std::mutex> lock(m);
data = 10;
ready = true;
// 通知等待线程
cv.notify_one();
}
// 等待线程执行完成
t.join();
// 输出主线程结束
std::cout << "Main thread executed" << std::endl;
return 0;
}
多线程程序的调试比单线程程序复杂,需要特殊的工具来帮助程序员进行调试。
GDB是GNU项目开发的一种调试工具,可以在多线程程序中进行断点调试、查看线程状态等操作。
# 编译代码并启动GDB
g++ -g -pthread main.cpp
gdb ./a.out
# 设置断点并运行程序
break main
run
# 查看线程状态
info threads
# 切换线程上下文
thread 2
# 继续执行
continue
Valgrind是一种动态分析和调试工具,可以检测内存泄漏、死锁等问题。
# 安装Valgrind
sudo apt-get install valgrind
# 检测内存泄漏等问题
valgrind ./a.out
C++的线程机制可以方便地实现多线程编程,但需要考虑线程安全问题,并使用相应的调试工具进行多线程调试。