c++ 多线程摘记

发布时间 2023-04-10 14:54:05作者: 空明流光

有没有 linux 和 windows 通用的 多线程库?

ChatGPT:

是的,C++11 标准引入了一个名为 std::thread 的多线程库,它可以在 Windows 和 Linux 上使用。std::thread 库提供了一种方便的方式来创建和管理线程,包括启动、等待、终止和同步线程。此外,它还提供了一些便利的功能,例如线程局部存储和异步执行任务等。

使用 std::thread 需要包含 <thread> 头文件,示例代码如下:

#include <iostream>
#include <thread>

void myThreadFunc(int i)
{
    std::cout << "Thread " << i << " started." << std::endl;
}

int main()
{
    std::thread t1(myThreadFunc, 1);
    std::thread t2(myThreadFunc, 2);

    t1.join();
    t2.join();

    return 0;
}

这个例子创建了两个线程,每个线程都调用 myThreadFunc 函数,并传递不同的参数。主线程等待两个线程都完成之后才会结束。

std::thread 如何实现线程互斥锁?
ChatGPT:

在C++11标准中,提供了 std::threadstd::mutex 两个类来实现多线程和互斥锁。

下面是一个使用 std::threadstd::mutex 实现线程互斥锁的示例代码:

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

std::mutex mtx;

void thread_function(int id)
{
    mtx.lock();
    std::cout << "Thread " << id << " starts working." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Thread " << id << " finishes working." << std::endl;
    mtx.unlock();
}

int main()
{
    std::thread t1(thread_function, 1);
    std::thread t2(thread_function, 2);

    t1.join();
    t2.join();

    return 0;
}

在上面的示例代码中,使用了 std::mutex 类来创建互斥锁。在 thread_function 函数中,调用了 mtx.lock() 来锁定互斥锁,使得只有一个线程可以进入临界区。在临界区内,线程会执行一些操作,然后再调用 mtx.unlock() 来释放互斥锁,以便其它线程可以进入临界区。最后,在主函数中,调用了 t1.join()t2.join() 来等待两个子线程的执行结束。

需要注意的是,在使用互斥锁时,需要确保每个线程都能够正确地获取和释放锁,否则就会出现死锁或者竞态条件等问题。