![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
Muzzik
动动你的金手指点个赞吧!
展开
-
C++ 死锁检测
······不想写注解了,认真点的人看代码和注释都能懂。第一版,还没优化性能。另外建议不要将死锁处理的代码镶入release版本之中,会影响性能。最好的办法是用来调试。在debug时先将出现死锁的地方排除。然后发布时去掉这个死锁检测系统,可以利用宏。······源码及使用代码都在下面了,命名和函数体都可以按照自己习惯进行重构。希望能帮到大家。如果觉得还行那就给个赞吧。struct test { CRITICAL_SECTION cri; test() { InitializeCriticalS原创 2020-06-02 21:04:47 · 2290 阅读 · 0 评论 -
C++ 一句代码打印当前线程ID
功能代码: printf("ThreadID: %d\n", (*(uint32_t*)&std::this_thread::get_id());我们要获取线程id,那么必然要用到get_id这个函数,那么我们看看这个函数返回的是什么。看到了吗, _Thrd_id()其实是一个uint32_t类型的返回值,但是却被转换成了thread::id类型,那么我们再来看看thread::i...原创 2020-04-02 03:06:38 · 11847 阅读 · 2 评论 -
WSASend体会以及WSAENOBUFS错误思路
1. 无论投递多大的缓冲区它都是立即返回2. 返回成功只是表示将数据拷贝到了发送缓冲区3.GetQueuedCompletionStatus返回成功只表示发送成功,并不代表对方成功接收到数据4.WSAWaitForMultipleEvents 和 WSAGetOverlappedResult 同 3 类似个人结论:网上的宣称投递0字节WSASend并没有什么卵用。WSASend返回WSAENOBUFS不用理会,前提是你必须把发送缓冲列表里的数据放在GetQueuedCompletionStatu..原创 2020-05-10 05:27:58 · 722 阅读 · 0 评论 -
减少锁竞争方法
1. 设置双重进入锁判断,例:bool enter = false;void test() { if (enter) { return; } mutex.lock(); if (enter) { return; } enter = true; mutex.unlock(); // 代码块.. enter = false;}第一次的判断可以防止在代码块执行的时间内其他线程频繁执行test函.原创 2020-05-11 02:55:58 · 293 阅读 · 0 评论 -
std::enable_shared_from_this有什么意义?进来告诉你
之前我一直不知道std::enable_shared_from_this有什么意义,官方的解答是传递自身的智能指针,但我也一直没用到,都是以第三者的身份管理和传递其他类型的智能但是,直到我看到了一篇知乎的帖子,上面是这么说的:需求: 在类的内部需要自身的shared_ptr 而不是this裸指针场景: 在类中发起一个异步操作, callback回来要保证发起操作的对象仍然有效.但是我自己测试了一下,对象销毁后再调用对象成员函数发现用std::enable_shared_from_this获取指针原创 2020-05-30 00:18:41 · 732 阅读 · 1 评论 -
如何保证在多线程中对象的有效性?进来告诉你
大家一定在网上看过其他文章,都是说用std::shared_ptr,其实还有一种情况,就是在std::shared_ptr也销毁后的情况下调用对象的函数,这时候会直接抛出错误那么我们如何安全的使用一个对象呢,很简单,利用std::shared_ptr + std::enable_shared_from_this,如果我们在对象销毁后再调用对象成员函数 std::shared_from_this() 获取指针的时候就会抛出异常。起初觉得并没有什么用,用this访问其他成员也会报错啊。但是我转念一想,抛出异常原创 2020-05-30 00:40:34 · 218 阅读 · 0 评论