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

📅  最后修改于: 2023-12-03 14:59:49.563000             🧑  作者: Mango

C++线程

C++是一种多线程编程语言,允许程序员在同一程序中运行多个线程并发的进行。

创建线程
1. 使用标准库

使用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()方法等待线程执行完成。

2. 使用Lambda表达式

也可以使用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)。

1. 互斥锁

互斥锁是保证资源在多个线程之间互斥访问的一种机制。

#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;
}
2. 条件变量

条件变量是允许线程在某些条件得到满足时才执行的一种机制。

#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;
}
多线程调试

多线程程序的调试比单线程程序复杂,需要特殊的工具来帮助程序员进行调试。

1. GDB

GDB是GNU项目开发的一种调试工具,可以在多线程程序中进行断点调试、查看线程状态等操作。

# 编译代码并启动GDB
g++ -g -pthread main.cpp
gdb ./a.out

# 设置断点并运行程序
break main
run

# 查看线程状态
info threads

# 切换线程上下文
thread 2

# 继续执行
continue
2. Valgrind

Valgrind是一种动态分析和调试工具,可以检测内存泄漏、死锁等问题。

# 安装Valgrind
sudo apt-get install valgrind

# 检测内存泄漏等问题
valgrind ./a.out
结论

C++的线程机制可以方便地实现多线程编程,但需要考虑线程安全问题,并使用相应的调试工具进行多线程调试。