多线程运行问题

函数原型(包含在windows.h中)

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPWORD lpThreadid)

 

下面具体说明:

 

lpThreadAttributes : 指向SECURITY_ATTRIBUTES结构体的指针,在NT系统中有效。传递NULL值表示使用默认的安全性。如果希望所有的子进程能继承该线程对象的句柄,就必须要设定一个SECURITY_ATTRIBUTES结构体。

 

dwStackSize : 设定线程初始栈的大小。以字节为单位。系统会将其四舍五入为最接近的页面大小。如果值为0或小于默认提交大小,则使用和调用该函数的线程相同的栈大小。

 

lpStartAddress : 表示新线程的起始地址。这要求在程序中定义一个函数作为入口函数。名称任意。但是格式必须为:

DWORD WINAPI 函数名(LPVOID lpParameter)

 

dwCreationFlags : 设置用于控制线程创建的附加标记,值可以为CREATE_SUSPENDED或0。如果为前者则线程创建后被挂起。直到程序调用了ResumeThread函数。如果为后者,则线程创建后直接运行。

 

lpThreadid : 在9x架构下,必须指定此值作为线程ID。NT架构下可以指定,也可以传NULL参数表示匿名线程。

 

HANDLE newThread1;
newThread1 = CreateThread(NULL,0,function,NULL,0,NULL);

CloseHandle(newThread1);

这是代码的实现过程

当主线程实现过快的时候,其他线程很可能未得到执行主函数便已经结束。此时需要调用Sleep函数对主线程进行休眠,以创造其他线程进行的机会。

如Sleep(1),Sleep的参数为DWORD(32位unsigned long)类型,单位为ms。

 

线程的同步使用:

当多线程需要同时进行时,可能会发生多个线程同时调用一个对象的情况。这个时候可以通过互斥对象来达到线程的同步。

 

(1)创建互斥对象

HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL binitialOwner,LPCTSTR lpNarne)

lpMutexAttributes : 指向SECURITY_ATTRIBUTES结构体的指针。传递NULL值表示使用默认的安全性。

 

binitialOwner : 用于指定互斥对象初始的拥有者,如果该值为true,则创建这个互斥对象的线程对其拥有所有权。

 

lpName : 指定互斥对象的名称。如果参数为NULL则创建匿名的互斥对象。

 

调用成功后该函数返回所创建互斥对象的句柄。

 

(2)释放互斥对象

BOOL ReleaseMutex(HANDLE hMutex)

 

(3)申请使用互斥对象

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds)

 

hHandle : 所请求的对象的句柄。一旦该对象处于有信号状态就返回。如果该对象始终处于无信号状态,即未通知有信号的状态,则函数一直等待从而实现暂停线程的使用。

 

dwMilliseconds : 指定等待的时间间隔。以ms为单位。过了等待时间若该对象仍无信号,则此函数返回。

特殊地,此参数设置为0,即测试后立即返回,设为INFINITE,则会一直等待信号。

 

此函数的返回值:

 

WAIT_OBJECT_0 : 有信号

WAIT_TIMEOUT : 直到超时,此阶段内无信号

WAIT_ABANDONED : 该互斥对象在上一线程调用后未被释放。该对象的所有权交予当前线程并且此互斥对象被设置为无信号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值