📜  多线程 - C++ (1)

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

多线程 - C++

多线程是指程序中包含多个执行流,每个执行流都可以并行执行不同的任务,从而提高程序的处理能力。在 C++ 中,可以使用多线程库来实现多线程编程。

多线程库

C++ 提供了多线程库 thread,该库允许开发者创建和管理多个线程。以下是一些常用操作:

创建线程

使用 std::thread 类可以创建一个新线程。以下是一个示例代码:

#include <iostream>
#include <thread>

// 线程函数
void thread_function()
{
    std::cout << "Hello World!" << std::endl;
}

// 主函数
int main()
{
    // 创建一个新线程
    std::thread threadObj(thread_function);

    // 等待线程结束
    threadObj.join();

    return 0;
}

以上代码创建了一个新线程,并调用 thread_function 函数执行其中的任务。

传递参数

可以通过创建函数对象,并向其传递参数来传递参数给新线程。以下是一个示例代码:

#include <iostream>
#include <thread>

// 线程函数
void thread_function(int n)
{
    std::cout << n << std::endl;
}

// 主函数
int main()
{
    // 创建一个新线程
    std::thread threadObj(thread_function, 5);

    // 等待线程结束
    threadObj.join();

    return 0;
}

以上代码创建了一个新线程,并传递了整数 5 给 thread_function 函数。

等待线程结束

可以使用 join 函数来等待线程结束。以下是一个示例代码:

#include <iostream>
#include <thread>

// 线程函数
void thread_function()
{
    std::cout << "Hello World!" << std::endl;
}

// 主函数
int main()
{
    // 创建一个新线程
    std::thread threadObj(thread_function);

    // 等待线程结束
    threadObj.join();

    std::cout << "Thread joined" << std::endl;

    return 0;
}

以上代码创建了一个新线程,并等待其结束后输出 Thread joined

多线程安全

多线程编程需要注意线程安全问题。在多个线程之间读写共享数据可能会导致数据不一致或者程序错误。以下是一些常用的多线程安全技术:

互斥锁

互斥锁是一种用于多线程编程保护共享数据的同步机制。以下是一个示例代码:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

// 线程函数
void thread_function()
{
    mtx.lock();
    std::cout << "Hello World!" << std::endl;
    mtx.unlock();
}

// 主函数
int main()
{
    // 创建多个新线程
    std::thread threadObj1(thread_function);
    std::thread threadObj2(thread_function);
    std::thread threadObj3(thread_function);

    // 等待所有线程结束
    threadObj1.join();
    threadObj2.join();
    threadObj3.join();

    std::cout << "All threads joined" << std::endl;

    return 0;
}

以上代码创建了多个新线程,并使用 std::mutex 保护共享资源的输出,确保执行顺序不会交错。

条件变量

条件变量是一种用于多线程编程的同步机制,允许线程挂起等待某个条件成立,直到其他线程通知该条件成立才唤醒线程。以下是一个示例代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool isReady = false;

// 线程函数
void thread_function()
{
    std::unique_lock<std::mutex> lck(mtx);
    cv.wait(lck, []{return isReady;});
    std::cout << "Hello World!" << std::endl;
}

// 主函数
int main()
{
    // 创建一个新线程
    std::thread threadObj(thread_function);

    // 等待一段时间
    std::this_thread::sleep_for(std::chrono::seconds(5));

    {
        std::lock_guard<std::mutex> lck(mtx);
        isReady = true;
    }
    cv.notify_one();

    // 等待线程结束
    threadObj.join();

    std::cout << "Thread joined" << std::endl;

    return 0;
}

以上代码创建了一个新线程,并使用条件变量等待指定条件成立再执行任务。

结论

多线程编程是一项复杂的任务,需要注意线程安全问题。C++ 中的多线程库提供了丰富的功能,方便开发者创建和管理多个线程,更好地利用多核处理器的能力,加速程序的处理速度。