📜  c++ 创建线程 - C++ (1)

📅  最后修改于: 2023-12-03 15:29:52.421000             🧑  作者: Mango

C++ 创建线程

简介

多线程技术是现代程序设计中十分重要的一个技术,在程序中使用多线程可以大大提高程序的运行效率和响应能力。在C++中,创建线程的方法很简单,这里就来介绍一下如何在C++程序中创建线程。

创建线程的方式
创建方式一:使用C++11线程库
#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类来支持多线程编程。

创建方式二:使用Windows API
#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类来实现信号量。需要注意的是,在使用信号量时,需要定义一个全局的计数器来实现信号量的功能。