Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:cpp:标准多线程

C++标准多线程

多线程根据不同的平台要求有所不同,自C++11之后,语言层面提供了原生的、跨平台的多线程工具
Windows:使用Visual Studio即可,无需设置
Linux:在编译的时候加上选项 -lpthread


附加、抛弃线程

附加:把一个线程附加到主线程(等它结束)
抛弃:放弃一个线程的所属权
一定要在和线程相关联的std::thread销毁前,执行附加或抛弃

线程休眠

因为多个线程之间一般需要协调进度,所以可能需要等待
一般是用信号量

锁(互斥量)

保护一块内存区域,注意逻辑要防止死锁

#include<mutex>
 
int main()
{
    std::mutex LockForSomething;
 
    LockForSomething.lock();
 
    //Safe Place to Do Some Change
 
    LockForSomething.unlock();
 
    return 0;
}

原子操作

原子类型的变量可以被保护,不会产生多个线程同时访问的冲突

#include<atomic>
#include<cstdio>
 
//声明一个原子类型的int
//对它的操作都是原子的,不会被打断
std::atomic<int> Count;
 
int main()
{
    //赋值、运算、比较这些重载了的都是正常的
    Count=0;
    Count=Count+10;
    if(Count>0);
 
    //输出
    int _x;printf("%d\n",_x=Count);
 
    return 0;
}

线程操作

#include<algorithm>
#include<thread>
#include<cstdio>
 
//For Work
void SayHello(int x)
{
    for (int i = 1; i <= x; i += 1)
    {
        printf("[%02d] Hello\n", i);
    }
}
 
int main()
{
    using std::thread;
 
    auto p_thread = new thread(SayHello, 10);
 
    if (p_thread->joinable())
    {
        p_thread->join();
        //p_thread->detach();
    }
 
    delete p_thread;
 
    return 0;
}

条件变量

condition_variable

以下的信号量就是基于条件变量实现的
信号量手动实现

#pragma once
 
#include <mutex>
#include <condition_variable>
 
class Semaphore
{
private:
    std::mutex mutex;
    std::condition_variable cv;
    int count;
 
public:
    explicit Semaphore(int count = 0) : count(count) {}
 
public:
    void Signal()
    {
        std::unique_lock<std::mutex> lock(mutex);
        ++count;
        cv.notify_one();
    }
 
    void Wait()
    {
        std::unique_lock<std::mutex> lock(mutex);
        cv.wait(lock, [=] { return count > 0; });
        --count;
    }
};
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/cpp/标准多线程.txt · Last modified: 2022/03/24 12:00 (external edit)