![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
iteye_10289
这个作者很懒,什么都没留下…
展开
-
多线程 CreateThread与_beginthreadex本质区别
本文参考了 http://blog.csdn.net/morewindows/article/details/7421759主函数创建一个线程,并且等待它执行完毕 #include <iostream>#include <windows.h>using namespace std;DWORD WINAPI threadFunc(PVOID ...原创 2013-11-01 14:24:28 · 85 阅读 · 0 评论 -
读写锁SRWLock
读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。 对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读取者线程等待。 因此用读写锁来解决读者写者问题会使代码非常清晰和简洁。 SRWLock 允许我们区分那些想要读取资...2013-11-27 14:22:34 · 380 阅读 · 0 评论 -
读者写者问题
第一 写者要等到没有读者时才能去写文件。 第二 所有读者要等待写者完成写文件后才能去读文件。 1. 对互斥量进行判断时,在进入关键段后还要在判断一次,实现双重检测。2. 在读线程的第一个关键段中,使用旋转锁,可以避免在第二个关键段中,别的线程提前释放写者互斥量的情况。3. 在写者中,只是做了比较简单的判断,来实现和读者的互斥运行。 #inclu...2013-11-26 19:20:29 · 95 阅读 · 0 评论 -
生产者消费者问题
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲...2013-11-25 18:54:29 · 77 阅读 · 0 评论 -
经典线程同步总结 关键段 事件 互斥量 信号量
本文参考了http://blog.csdn.net/morewindows/article/details/7538247 1.线程(进程)同步的主要任务 答:在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别是在急用临界资源时,如多个线程急用同一台打印机,会使打印结果交织在一起,难于区分。当多个线程急用共享变量,表格,链表时,可能会导致数据处理出错,因此线程同步的主要...原创 2013-11-24 20:30:31 · 78 阅读 · 0 评论 -
经典线程同步 信号量Semaphore
信号量Semaphore常用有三个函数,使用很方便。下面是这几个函数的原型和使用说明。 第一个 CreateSemaphore函数功能:创建信号量函数原型: HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, ...2013-11-22 18:35:20 · 159 阅读 · 0 评论 -
初学关键段容易忽略的问题
今天遇到了一个初学关键段的问题,在多线程运行条件下,关键段总是遇到异常,先说一说代码#include <iostream>#include <windows.h>#include <process.h>using namespace std;const int NUM = 10;HANDLE semaphore;CRITIC...原创 2013-11-22 15:01:19 · 122 阅读 · 0 评论 -
终止运行线程的注意事项
终止运行线程1. 线程函数返回。2. 线程通过调用ExitThread函数“杀死”自己(避免使用)。3. 同一个进程或另一个进程中的线程调用TerminateThread函数(避免使用)4. 包含线程的进程终止运行(避免使用) 让线程函数返回,可以确保:1. 线程函数中创建的所有C++对象都通过其析构函数被正确的销毁;2. 操作系统正确释放线程栈使用的内存;...原创 2013-11-06 15:51:21 · 135 阅读 · 0 评论 -
经典线程同步 互斥量Mutex的使用分析
互斥量(mutex)内核对象用来确保一个线程独占对一个资源的访问。 互斥量对象包含一个使用计数、线程ID以及一个递归计数。 互斥量与关键段的行为完全相同。但是,互斥量是内核对象,而关键段是用户模式下的同步对象。 线程ID用来标识当前占用这个互斥量的是系统中哪儿个线程,递归计数表示这个线程占用该互斥量的次数。 他们一般用...2013-11-05 22:29:33 · 298 阅读 · 0 评论 -
经典线程同步 事件Event
Event 内核对象,实际上是解决线程同步问题的利器。介绍下函数应用: 第一个 CreateEvent函数功能:创建事件函数原型:HANDLECreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName...原创 2013-11-04 20:30:05 · 161 阅读 · 0 评论 -
旋转锁的解释
当一个线程试图进入一个关键段,但这个关键段正被另一个线程占用的时候,函数会立即把调用线程切换到等待状态。这意味着线程必须从用户模式切换到内核模式(大于1000个CPU周期),这个切换的开销非常大。在配有多处理器的机器上,当前占用资源的线程可能在另一个处理器上运行,而且可能很快就会结束对资源的访问。事实上,在需要等待的线程完全切换到内核模式之前,占用资源的线程可能就已经释放了资源...原创 2013-11-04 14:14:58 · 1487 阅读 · 0 评论 -
经典线程同步 关键段CS
本文参考http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION一共就四个函数,使用很是方便。下面是这四个函数的原型和使用说明。 函数功能:初始化函数原型:void InitializeCriticalSection(LPCRITICAL_SECTION lpCritical...原创 2013-11-04 13:35:38 · 144 阅读 · 0 评论 -
一个经典的多线程同步问题
本篇文章参考了http://blog.csdn.net/morewindows/article/details/7442333 程序描述:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。要求:1.子线程输出的线程序号不...原创 2013-11-02 16:47:39 · 144 阅读 · 0 评论 -
WaitForMultipleObjects函数有效值分析
WaitForMultipleObjects函数存在一个固定的有效值为1~64,所以在上一篇(http://xiabin1235910-qq-com.iteye.com/admin/blogs/1968778)文章中,当线程数大于64时,会出现不稳定现象,如下:(此时线程数为70)如果在输出的语句之前,加上一个sleep(500)语句,则会正常,代码如下:#include <w...原创 2013-11-01 21:19:04 · 196 阅读 · 0 评论 -
WaitForMultipleObjects函数及原子操作Interlocked系列函数
先说一说这一篇用到的多线程等待函数:如下 WaitForMultipleObjects( DWORD nCount, CONST HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds );nCount 表示我们希望函数检查的内核对象的数量。这个值必须在1~ MAXIMUM_WA...原创 2013-11-01 20:53:54 · 133 阅读 · 0 评论 -
同步机制的性能比较
本篇文章参考 windows核心编程 P215下图这个简单的测试会产生1个,2个,4个线程,这些线程会使用不同的线程同步机制来重复执行相同的任务,在双核处理器上执行结果如下: 线程/微秒 volatile读取 volatile写入 interlocked递增 关键段 SRWLock共享模式 SRWLock独占模式 互斥量 1 ...2013-11-27 16:13:42 · 148 阅读 · 0 评论