关闭

VC多线程同步问题

标签: VC 多线程 同步
365人阅读 评论(0) 收藏 举报
分类:

线程同步的方法很多,最常用的用互斥(CMutex)、临界(CritiacalSection)、信号量(Semaphone)、事件(Event)等,这四种方式分别在Win32和MFC下各有一种实现,MFC方式是对Win32方式的封装,使用起来更加方便。

以Critical Section为例:

Win32方式:

// 临界区结构对象
CRITICAL_SECTION g_cs;
// 共享资源 
char g_cArray[10];
UINT ThreadProc10(LPVOID pParam)
{
 // 进入临界区
 EnterCriticalSection(&g_cs);
 // 对共享资源进行写入操作
 for (int i = 0; i < 10; i++)
 {
  g_cArray[i] = 'a';
  Sleep(1);
 }
 // 离开临界区
 LeaveCriticalSection(&g_cs);
 return 0;
}
UINT ThreadProc11(LPVOID pParam)
{
 // 进入临界区
 EnterCriticalSection(&g_cs);
 // 对共享资源进行写入操作
 for (int i = 0; i < 10; i++)
 {
  g_cArray[10 - i - 1] = 'b';
  Sleep(1);
 }
 // 离开临界区
 LeaveCriticalSection(&g_cs);
 return 0;
}
……
void CSample08View::OnCriticalSection() 
{
 // 初始化临界区
 InitializeCriticalSection(&g_cs);
 // 启动线程
 AfxBeginThread(ThreadProc10, NULL);
 AfxBeginThread(ThreadProc11, NULL);
 // 等待计算完毕
 Sleep(300);
 // 报告计算结果
 CString sResult = CString(g_cArray);
 AfxMessageBox(sResult);

MFC方式:

// MFC临界区类对象
CCriticalSection g_clsCriticalSection;
// 共享资源 
char g_cArray[10];
UINT ThreadProc20(LPVOID pParam)
{
 // 进入临界区
 g_clsCriticalSection.Lock();
 // 对共享资源进行写入操作
 for (int i = 0; i < 10; i++)
 {
  g_cArray[i] = 'a';
  Sleep(1);
 }
 // 离开临界区
 g_clsCriticalSection.Unlock();
 return 0;
}
UINT ThreadProc21(LPVOID pParam)
{
 // 进入临界区
 g_clsCriticalSection.Lock();
 // 对共享资源进行写入操作
 for (int i = 0; i < 10; i++)
 {
  g_cArray[10 - i - 1] = 'b';
  Sleep(1);
 }
 // 离开临界区
 g_clsCriticalSection.Unlock();
 return 0;
}
……
void CSample08View::OnCriticalSectionMfc() 
{
 // 启动线程
 AfxBeginThread(ThreadProc20, NULL);
 AfxBeginThread(ThreadProc21, NULL);
 // 等待计算完毕
 Sleep(300);
 // 报告计算结果
 CString sResult = CString(g_cArray);
 AfxMessageBox(sResult);
}

0
0
查看评论

VC++深入详解(14):多线程与线程同步(重新修改版)

考虑到内容的连贯性,我对几乎重写了这篇博客,在这一小节,主要介绍线程以及线程间的同步,而把那个聊天工具放到下一节。 什么是程序?程序是计算计指令的集合,它以文件的形式储存在磁盘上。 什么是进程?进程是一个正在运行的程序的实例,是一个程序在其自身的地址空间内中的一次执行活动。因此,一个程序可以对应...
  • thefutureisour
  • thefutureisour
  • 2012-11-07 08:24
  • 10804

VC多线程编程二(多线程同步问题)

<br />一、在上一遍文章中写到多线程可能存在 问题,现使用程序证明:<br /> <br />    在原有 的程序ThreadProc1中加入语句Sleep(1000),其他语句不变。<br /> ...
  • zzhzcl15
  • zzhzcl15
  • 2010-10-08 10:12
  • 782

IOS多线程同步问题

IOS开发多线程开发,同步块,NSLock,NSCondition
  • little_qi
  • little_qi
  • 2017-09-04 10:46
  • 174

c# 通讯死锁问题 线程同步问题

第一篇文章我相信很多人不看都能做的出来,但是,用过微软SerialPort类的人,都遇到过这个尴尬,关闭串口的时候会让软件死锁。天哪,我可不是武断,算了。不要太绝对了。99.9%的人吧,都遇到过这个问题。我想只有一半的人真的解决了。另外一半的人就睁只眼闭只眼阿弥佗佛希望不要在客户那里出现这问题了。 ...
  • c2716266
  • c2716266
  • 2012-01-18 15:29
  • 827

Java 多线程同步问题的探究-经典讲解

Java 多线程同步问题的探究(五、你有我有全都有—— ThreadLocal如何解决并发安全性?)【更新重要补疑】Java 多线程同步问题的探究(四、协作,互斥下的协作——Java多线程协作(wait、notify、notifyAll))Java 多线程同步问题的探究(三、Lock来了,大家都让...
  • liuhl0910
  • liuhl0910
  • 2015-05-20 15:39
  • 1013

VC++线程同步-事件对象

这是整理孙鑫VC得到的关于线程同步方面的笔记.   n       事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通...
  • cjjwwss
  • cjjwwss
  • 2014-03-21 17:30
  • 646

Java Web笔记 – Servlet多线程同步问题及其解决方法

ServletContext和Web应用关系: 当servlet容器启动Web应用,并为每个Web应用创建唯一的ServletContext对象。可以吧ServletContext看成一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,提供了读取或设置共享数据...
  • zi_jun
  • zi_jun
  • 2012-11-24 15:50
  • 789

多线程同步问题

-(void)threadA{     while (1) { //        [_lock lock]; //        if (_ticketLeft // ...
  • helloWorldGL
  • helloWorldGL
  • 2015-09-16 15:53
  • 171

VC 多线程同步方式操作串口

#include #include using namespace std; DWORD WINAPI CommReceive(LPVOID lpParameter); DWORD WINAPI CommSend(LPVOID lpParameter); HANDLE hwbEvent; HANDL...
  • hwb_1988
  • hwb_1988
  • 2013-08-13 16:24
  • 1758

【多线程系列】Volatile总结之同步问题

Volatile总结之同步问题 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 &#...
  • gooooooal
  • gooooooal
  • 2015-11-24 16:05
  • 1757
    个人资料
    • 访问:215099次
    • 积分:3459
    • 等级:
    • 排名:第11439名
    • 原创:154篇
    • 转载:43篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论