笔记_Atomic详解_复习_Async与Thread的区别_recursive_mutex_虚假唤醒_线程池

Atomic详解

一般的原子操作,针对++,--,+=,&=,|=,^=是支持的,其他的可能不支持
比如std::atomic<int> myato = 0;
myato = myato+1;
这种结果会不对.

Async深入

复习

Async:用来创建一个异步任务.
std::launch::deferrer[延迟调用]
std::launch::async[强制创建一个新线程]
async为什么不和Thread一样叫创建一个线程呢?
因为async有时候不一定创建一个新线程,比如,在主函数直接调用的例子.

 int fun()
{
    cout << "thread  " << this_thread::get_id() << endl;
    return 1024;
}
int main()
{
    cout << "thread  " << this_thread::get_id()<<endl;
    std::future<int> xx = std::async(std::launch::deferred,fun);
    cout<<xx.get()<<endl;
    return 0;
}


延迟到get执行为止,而且没创建一个新线程
如果不Get,直接不执行.

Async与Thread的区别

1.Thread创建的线程,如果系统资源紧张,创建失败,程序就会崩溃
2.std::thread如果有返回值,不容易拿到.Async可以用Future接
3.由于系统资源限制

如果用thread创建的线程太多,可能会创建失败.系统崩溃
如果用std::async创建,一般就报异常不会崩溃.就不会创建新线程,而是后续谁
调用了Get,就运行在执行这条语句的线程上.
经验:一个程序中,线程数量不适合超过100-200,

recursive_mutex 递归独占互斥量

允许同一个互斥量多次被lock
std::lock_guard<std::recursive_mutex> xxx(入口函数);

timed_mutex,recursive_timed_mutex

带超时功能的独占互斥量

try_lock_for():等待多少秒来获取锁,返回一个bool
try_lock_unit():带递归的等待时间是否获取锁.这里是未来的时间点,返回一个bool

虚假唤醒

unique.wait()后,下面多次notify_one,虚假唤醒的一种情况
wait中要有第二参数,并且这个表达式中要正确判断处理公共数据是否存在

load()


以原子方式读取atomic对象的值


store()


以原子方式写入内容
atomic<int> atm2(atm.load());
atm2.store(11);

线程池部分(待完成)

设想应用:


服务器->客户端,每来一个客户端,就创建一个新的线程为客户提供服务
1.游戏服务器,假设10w玩家
不可能给每个玩家创建个新线程
2.程序稳定性也有问题
推出了线程池的概念,创建好一堆线程,然后统一管理调度,循环利用线程的方式,叫
线程池.

扫描二维码关注公众号,回复: 14888707 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_35337794/article/details/121758252