- 博客(12)
- 资源 (50)
- 收藏
- 关注
转载 C++安全并发访问容器元素
标准库STL的vector, deque, list等等不是线程安全的。例如 线程1正在使用迭代器(iterator)读vector,线程2正在对该vector进行插入操作,使vector重新分配内存,这样就造成线程1中的迭代器失效。多个线程读是安全的,在读的过程中,不能对容器有任何写入操作多个线程可以同时对不同的容器做写入操作。不能指望任何STL实现来解决线程难题,必须手动做同步控制.方案1 对vector进行加锁处理effective STL给出的Lock框架template<type
2021-05-31 11:22:29 870
转载 sleep(0) 与sleep(>0)区别
sleep (1) 与sleep (0)的区别与线程的优先级有关系。线程创建后,会进入线程调度队列。 线程调度队列通常按线程的优先级分成多个队列。 每个优先级都会有一个队列。sleep(1)函数的调用会使线程进入等待状态。这个时候线程上下文会被切换出去。调用sleep(0) 的时候, 如果调度器中不存在优先级 >= 该线程优先级的情况下,该线程将会继续运行。否则,线程会被放入到其优先级相应的队列尾部。也就是说我们调用sleep(0) 时 ,通常会让程序里其他线程获得更多的运行时间。...
2021-05-17 17:58:34 328
转载 无锁队列的链表实现
首先,无锁队列的实现基于原子操作CAS(_sync_vale_compare_and_swap)GCC下的CAS实现:bool __sync_bool_compare_and_swap (type *accum, type *dest, type newval){ if(*accum==*dest){ *dest=newval; return true; } return false;}type __sync_val_compare_and_swap (type *ptr,
2021-05-17 15:54:01 406
转载 基于C++ STL利用CAS原子操作封装的无锁list
在做高吞吐量的项目中,性能是必须考虑的一个重要因素。而数据同步则又是重中之重,常常需要使用到锁,但是锁的使用会造成性能下降。这个时候,CAS就大显身手了,关于CAS,这里就不再多说。直接贴我基于STL list的封装的无锁list,其他容器则类似。文件1:lockfree_list.hpp#ifndef JZ_LOCK_FREE_LIST_HPP#define JZ_LOCK_FREE_LIST_HPP #include <list> /** 说明:基于CAS封装的无锁Lis
2021-05-17 11:17:36 627
转载 内存池设计与实现
一、前言作为C++程序员,想必对于内存操作这一块是比较熟悉和操作比较频繁的;比如申请一个对象,使用new,申请一块内存使用malloc等等;但是,往往会有一些困扰烦恼着大家,主要体现在两部分:申请内存后忘记释放,造成内存泄漏内存不能循环使用,造成大量内存碎片这两个原因会影响我们程序长期平稳的运行,也有可能会导致程序的崩溃;二、内存池内存池是池化技术中的一种形式。通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每次申请内存和释放内存的时
2021-05-17 11:04:28 2400
转载 C++使用锁注意事项
锁不是万能的,有时 候使用锁会导致效率低下、造成死锁等异常情况发生;一般加锁原则: 不用锁>可重入锁>自动锁>手动锁一般情况下,使用可重入锁,避免一个线程内部自己锁住的问题。可重入锁的概念: 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不 发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。...
2021-05-17 10:59:32 1229
原创 boost asio异步和stl异步的简单对比
boost asio异步代码#include <iostream>#include <boost/asio.hpp>#include <boost/thread.hpp>void print(const int data){ if (data == 99999) std::cout << data << std::endl;}int main(){ boost::asio::io_service io_service;
2021-05-11 11:10:12 321
转载 boost lockfree queue-boost无锁队列
例子如下:#include <iostream>#include <boost/lockfree/queue.hpp>int main(){ boost::lockfree::queue<int, boost::lockfree::fixed_sized<false> > queue(128); for (int i = 0;i < 10000;i++) queue.push(i); while (!queue.empty())
2021-05-07 17:31:01 4136 1
原创 C++11中的std::call_once
某些场景下,我们需要代码只被执行一次,比如单例类的初始化,考虑到多线程安全,需要进行加锁控制。C++11中提供的call_once可以很好的满足这种需求,使用又非常简单。头文件#include template <class Fn, class... Args> void call_once (once_flag& flag, Fn&& fn, Args&&...args);call_once保证函数fn只被执行一次,如果有多个线程
2021-05-07 09:16:12 359
原创 [C++11]std::promise介绍及使用
一、std::promise介绍std::promise 是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程t1中保存一个类型typename T的值,可供相绑定的std::future对象在另一线程t2中获取。std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值
2021-05-06 18:32:28 8144 3
转载 c++的Lambda表达式
测试代码如下,不加’&'参数,vs直接报错class Test{public: void fun(); int data = 1;};void Test::fun(){ [](int a) {cout << data << endl;}(123);}int main(){ Test t; t.fun(); getchar(); return 0;}报错内容如下:封闭函数“this”不能在 lambda 体中引用,除非其位于捕获列
2021-05-06 16:18:33 2909
转载 C/C++ 协程库boost.coroutine2、魅族libgo、腾讯libco、开源libaco详解
最近研究高性能C++协程,网上了解到了魅族libgo、腾讯libco、开源libaco、boost coroutine,这里记录一下。1 什么是协程协程可以很轻量的在子例程中进行切换,它由程序员进行子例程的调度(即切换)而不像线程那样需要内核参与,同时也省去了内核线程切换的开销,因为一个协程切换保留的就是函数调用栈和当前指令的寄存器,而线程切换需要陷入内核态,改变线程对象状态。 go语言就已经把协程作为基础设施提供语言级的支持,cpp这种出了名的给程序员自由的语言肯定不会提供语言级的支持。
2021-05-06 10:08:38 3021 1
rtmp+ngix推流.7z
2020-08-02
Windows下RabbitMQ服务器安装.zip
2020-06-25
vs2017_community__1464315958.1583822625.zip
2022-07-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人