windows程序设计 多线程学习笔记

 

我的理解:

线程可以用来解决因为程序内部处理大量数据而造成的当机,比如图形界面因为程序正在处理大量资源初始化操作而无法相应用户的消息。(1/10秒规则)
一个程序中的线程共享程序的资源,但是线程有自己的堆栈空间。
早期版本线程可以创建消息队列也可以不创建消息队列,一个无消息队列线程无法向一个消息队列线程中的窗口发送消息,或者呼叫任何发送消息的函数(不过,它们可以将消息递送给消息队列线程)。
windows98/NT的线程都有一个消息队列。
这本书建议的编写多线程应用程序的结构:

因此在这里我将为您的程序建议一种架构:您的主执行绪建立您程序所需要的所有窗口,并在其中包含所有的窗口消息处理程序,以便处理这些窗口的所有消息;所有其它执行绪只进行一些背景处理,除了和主执行绪通讯,它们不和使用者进行交流。
可以把这种架构想象成:主线程处理使用者输入(和其它消息),并建立程序中的其它线程,这些附加的线程完成与使用者无关的工作。
创建线程的函数:
1、CreateThread (&security_attributes, dwStackSize, ThreadProc,
       
                       pParam, dwFlags, &idThread) ;
对应的线程函数声明:

DWORD WINAPI ThreadProc (PVOID pParam) ;

2、_beginthread(ThreadProc,uiStackSize,pParam);
对应的线程函数声明:

void __cdecl ThreadProc (void * pParam) ;

一般常用的参数是dwStackSize(线程的堆栈大小,如果赋值为0,则系统会根据线程中需要的堆栈空间动态调整堆栈大小),
ThreadProc(线程调用的函数的地址),
pParam(传给线程调用的函数的参数),

windows程序设计中多线程涉及到3个概念:
1、零界区
零界区就像一个繁华地段的十字路口(资源),如果横向纵向的汽车都想在同一时间经过这个路口结果可想而知,所以横向汽车要通过这个路口要先确定没有纵向汽车通过。
十字路口相当于程序中的共享资源。
多线程程序中,由临界区来做到这点:
CRITICAL_SECTION cs ;
相关函数:
InitializeCriticalSection (&cs) ;//初始化临界区变量
EnterCriticalSection (&cs) ;//进入临界区
LeaveCriticalSection (&cs) ;//离开临界区
DeleteCriticalSection (&cs) ;//删除临界区
临界区只用于同一个程序中的线程间的协调

2、事件对象
事件对象用于线程判断是否发生了某个事件以便处理相应的事情
HANDLE        hEvent ;
相关函数:

CreateEvent (&sa, fManual, fInitial, pszName) ;//创建临界区
SetEvent (hEvent) ;//设置事件对象
ResetEvent (hEvent) ;//重新设置事件对象
WaitForSingleObject (hEvent, dwTimeOut) ;//等待事件的发生

3、线程区域存储空间(tls)
线程区域空间解决的就是线程不共享一个局域静态数据的问题
比如函数f()中需要一个静态变量来持续记录一个数值,而这个函数被多个线程调用,单纯用
static声明的变量会被每个调用这个函数的线程共享,显然不能满足不需求
dwTlsIndex = TlsAlloc () ;//获得索引
TlsSetValue (dwTlsIndex, GlobalAlloc (GPTR, sizeof (DATA)) ;//设置值
TlsGetValue (dwTlsIndex) ;//获得值
GlobalFree (TlsGetValue (dwTlsIndex)) ;//释放线程分配的内存空间
TlsFree (dwTlsIndex) //释放索引
或者用MS对C的扩充功能
__declspec (thread) int iGlobal = 1 ;
__declspec (thread) static int iLocal = 2 ;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值