📅  最后修改于: 2023-12-03 15:29:52.421000             🧑  作者: Mango
多线程技术是现代程序设计中十分重要的一个技术,在程序中使用多线程可以大大提高程序的运行效率和响应能力。在C++中,创建线程的方法很简单,这里就来介绍一下如何在C++程序中创建线程。
#include <iostream>
#include <thread>
using namespace std;
// 线程函数
void threadFunc()
{
cout << "This is a new thread." << endl;
}
int main()
{
// 创建新线程
thread newThread(threadFunc);
// 等待新线程结束
newThread.join();
cout << "Main thread ends." << endl;
return 0;
}
这种方式是使用C++11标准中新增的线程库来创建线程。该库提供了std::thread类来支持多线程编程。
#include <iostream>
#include <windows.h>
using namespace std;
// 线程函数
DWORD WINAPI threadFunc(LPVOID lpParam)
{
cout << "This is a new thread." << endl;
return 0;
}
int main()
{
HANDLE hThread = CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
cout << "Main thread ends." << endl;
CloseHandle(hThread);
return 0;
}
这种方式使用Windows平台API函数来创建线程。需要注意的是,在使用Windows API创建线程时,需要手动释放线程句柄。
多线程编程中最常见的问题就是线程同步。多个线程同时访问共享资源会产生竞争条件,导致程序运行出现问题。在C++中,我们可以使用互斥量、信号量等同步机制来避免竞争条件。
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex mtx;
// 线程函数
void threadFunc()
{
mtx.lock(); // 加锁
cout << "This is a new thread." << endl;
mtx.unlock(); // 解锁
}
int main()
{
// 创建新线程
thread newThread(threadFunc);
mtx.lock(); // 加锁
cout << "Main thread starts." << endl;
mtx.unlock(); // 解锁
// 等待新线程结束
newThread.join();
cout << "Main thread ends." << endl;
return 0;
}
这里使用了C++11标准中的std::mutex类来实现互斥量。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
condition_variable cv;
mutex mtx;
// 全局计数器
int cnt = 0;
// 线程函数
void threadFunc()
{
for (int i = 0; i < 10; i++)
{
unique_lock<mutex> lock(mtx);
while (cnt % 3 != 0) // 等待信号量
{
cv.wait(lock);
}
cnt++;
cout << "This is thread 1." << endl;
cv.notify_all(); // 发送信号量
}
}
int main()
{
// 创建新线程
thread newThread(threadFunc);
for (int i = 0; i < 10; i++)
{
unique_lock<mutex> lock(mtx);
while (cnt % 3 != 1) // 等待信号量
{
cv.wait(lock);
}
cnt++;
cout << "This is thread 2." << endl;
cv.notify_all(); // 发送信号量
}
// 等待新线程结束
newThread.join();
cout << "Main thread ends." << endl;
return 0;
}
这里使用了C++11标准中的std::condition_variable类来实现信号量。需要注意的是,在使用信号量时,需要定义一个全局的计数器来实现信号量的功能。