随笔分类 - 多线程
摘要:一、原子互锁家族函数: (1)InterlockedIncrement: 加1操作。 (2)InterlockedDecrement: 减1操作。 (3)InterlockedExchangeAdd: 加上“指定”的值,可以加上一个负数。 (4)InterlockedExchange、Interlo
阅读全文
摘要:一、全局变量 注意:必须是一个进程底下的线程才可以使用全局变量,因为同一个进程底线的所有线程共享地址进程的地址空间。 二、发消息 //消息定义 #define MY_THREAD_MSG (WM_USER + 100) //接收 UINT PrintFunction(LPVOID pParam) {
阅读全文
摘要:1、自动释放线程对象 CWinThread *m_jyTestThread;m_jyTestThread = ::AfxBeginThread(ThreadFun, (LPVOID)this, THREAD_PRIORITY_NORMAL, 4 * 1024 * 1024, 0);if(m_jyTe
阅读全文
摘要:一、 当多个线程对同一资源进行使用时,会产生“争夺”的情况,为了避免这种情况的产生,也就出现了线程间的同步这个技术,本篇博文中将介绍使用信号量Semaphore达到线程间同步的目的。 二、相关函数和头文件 //头文件 #include <windows.h> //创建信号量API HANDLE WI
阅读全文
摘要:简介线程池(thread pool):一种线程的使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用
阅读全文
摘要:1.原子操作:原子操作可以理解为不需要用到互斥量加锁技术的多线程并发编程方式。 2.特点 (1):当程序中代码频繁用到互斥量(锁),此时原子操作的效率比互斥量(锁)高。 (2):原子操作一般针对的是一个变量,而不是一个代码段, 3.代码对比,以下代码1比代码2效率高很多 代码1 #include <
阅读全文
摘要:1.用到函数模板std::async,和类模板std::future 2工作原理:std::async用来启动一个异步任务,启动任务之后,它返回一个std::future对象,这个对象含有线程入口函数所返回的结果(线程返回的结果),线程执行完,我们可以通过调用future对象的成员函数get()来获
阅读全文
摘要:1.作用:在C++11中,我们可以使用条件变量(std::condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,并释放CPU,直到某种条件出现,这些线程才会被唤醒。条件变量需要和互斥量(锁)一起搭配使用。 用在多线程中。 线程A:等待一个条件满足 线程B
阅读全文
摘要:1.释放单例模式中的对象问题 2.单例模式中多线程时数据共享问题 #include <iostream> #include<thread> #include<string> #include<vector> #include<algorithm> #include<windows.h> #inclu
阅读全文
摘要:死锁问题被认为是线程/进程间切换消耗系统性能的一种极端情况。在死锁时,线程/进程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是任务永远无法执行完成。 死锁出现的场景:当代码中有2个锁,锁A和锁B,也有2个线程,线程1和线程2,线程1执行时,先抢到锁A,然后要去抢占B,同时线程2先
阅读全文
摘要:#include <iostream> #include<thread> using namespace std; void ThreadFun(const int &arr1,char *pBuf) { cout << arr1 << endl; cout << pBuf << endl; ret
阅读全文
摘要:1.用一个初始函数创建一个线程 #include <iostream> #include<thread> using namespace std; void PinrtFun() { cout << " 子线程运行" << endl; } int main() { std::thread t1(Pi
阅读全文