共 1,394 篇文章
共 6,621 篇文章及评论
- Association for Computing Machinery TechNews (ACM)
- Go Parallel! (Dr. Dobbs)
- HPCwire (Tabor Communications, Inc.)
- insideHPC (John West)
- Joe Duffy's Weblog (Microsoft)
- Microsoft Parallel Programming Development Center (Microsoft Germany)
- MultiCoreInfo.com
- scalability.org (Scalable Informatics)
- Software Dev Blog (Intel Germany)
- Soft Talk Blog (Intel United Kingdom)
- The Moth (Microsoft)
Archives
帖子来自 cauloda 
多线程同步 2:使用内核对象
作者: cauloda (2 篇文章) 日期: 八月 3, 2011 在 5:56 下午
评论 (0)
调用线程必须切换到核心态。 1. 等待函数: WaitForSingleObject 返回值:WAIT_OBJECT_0、WAIT_TIMEOUT、WAIT_FAILED; WaitForMultipleObjects 返回值:除了上面三个,还可能是已经触发的内核对象数量; 2. 事件内核对象(Event):自动重置(对等待函数有副作用)和手动重置 3. 可等待的计时器内核对象 用户计时器(发送WM_TIMER消息,此消息优先级是最低的) 4. 信号量(Semaphore) 5. 互斥量(mutex):线程所有,ReleaseMutex时先检查与等待线程ID是否相同,其余内核对象则没有“线程所有权”概念
分类: 博客征文专栏, 并行计算
多线程同步 1
作者: cauloda (2 篇文章) 日期: 八月 3, 2011 在 5:54 下午
评论 (0)
1. 原子访问:(从来不会把线程切换到等待状态) InterlockedExchangeAadd; // 原子加减 InterlockedIncrement; InterlockedExchange; // 原子赋值 应用:旋转锁(少用) InterlockedExchangePointer; 2. 高速缓存行: CPU会将所要取的内存数据的临近数据存到高速缓存行,因此将只读和可读写的数据适当分开组织可提高性能。 指针永远不需要volatile关键字修饰,因为会永远读取内存地址,编译器不会做任何优化。 3. 高级同步 关键段(critical section):锁代码(只能在同一个进程中同步,无法指定最长等待时间:容易死锁) 如果有全局CRITICAL_SECTION对象,则可以用它锁不同的代码段; EnterCriticalSection和LeaveCriticalSection; 必须初始化和反初始化:IntializeCriticalSection和DeleteCriticalSection; 优点:内部使用Interlock函数,速度快; 缺点:无法用来在多个进程之间对进程进行同步; 多处理器调用没有问题,只有一个处理器的线程能执行,其余都要等待; 由于线程进入等待状态要被系统从用户态切换到内核态,因此在使用关键段是应该总是同时使用旋转锁: IntializeCriticalSectionAndSpinCount,旋转锁循环次数经典值是4000; Slim读/写锁 以上方法的线程同步将保证线程在用户态:速度快。
