云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 多线程编程(1)

多线程编程(1)

  • 62 次阅读
  • 3 次下载
  • 2025/6/4 5:02:28

(2) 设置信号:在操作共享资源前,打开信号;完成操作后,关闭信号。这类似于互斥体对象的处理。

---------------------------------------------------------- 首先,创建信号对象:

HANDLE CreateSemaphore( ); 或者打开一个信号对象: HANDLE OpenSemaphore( );

然后,在线程的访问共享资源之前调用WaitForSingleObject。 共享资源访问完后,释放对信号对象的占用: ReleaseSemaphore();

信号对象允许同时对多个线程共享资源的访问,在创建对象时指定最大可同时访问的线程数。 当一个线程申请访问成功后,信号对象中的计数器减一;调用ReleaseSemaphore函数后,信号对象中的计数器加一。

其中,计数器值大于等于0,小于等于创建时指定的最大值。利用信号对象,我们不仅可以控制共享资源的访问,

还可以在应用的初始化时候使用。假定一个应用在创建一个信号对象时,将其计数器的初始值设为0,

这样就阻塞了其它线程,保护了资源。待初始化完成后,调用ReleaseSemaphore函数将其计数器增加至最大值, 进行正常的存取访问。

(3) 利用事件对象的状态,进行线程对共享资源的访问。 ----------------------------------------------------------

用ResetEvent函数设置事件对象状态为不允许线程通过;用SetEvent函数设置事件对象状态为可以允许线程通过。

事件分为手工释放和自动释放。如果是手工释放,则按照上述两函数处理事件的状态; 如果是自动释放,则在一个线程结束后,自动清除事件状态,允许其它线程通过。 (4) 设置排斥区。

----------------------------------------------------------

在排斥区中异步执行时,它只能在同一进程的线程之间共享资源处理。

虽然此时上面介绍的三种方法均可使用,但是,使用排斥区的方法则使同步管理的效率更高; 先定义一个CRITICAL_SECTION结构的排斥区对象,在进程使用之前先对对象进行初始化,调用如下函数:

VOID InitializeCriticalSection( LPCRITICAL_SECTION );

当一个线程使用排斥区时,调用函数:

EnterCriticalSection或者TryEnterCriticalSection 当要求占用、退出排斥区时,调用函数: LeaveCriticalSection

释放对排斥区对象的占用,供其它线程使用。

互斥体对象、信号对象和事件对象也可以用于进程间的线程同步操作。

在用Win32函数创建了对象时,我们可以指定对象的名字,还可以设置同步对象在子进程的继承性。

创建返回的是HANDLE句柄,我们可以用函数DuplicateHandle来复制对象句柄, 这样每个进程都可以拥有同一对象的句柄,实现进程之间的线程同步操作。

另外,在同一进程内,我们可以用OpenMutex、OpenSemaphore和OpenEvent来获得指定名字的同步对象的句柄。

排斥区异步执行的线程同步方法只能用于同一进程的线程之间共享资源处理, 但是这种方法的使用效率较高,而且编程也相对简单一些。 未完,待继............

所属分类:C/C++ 工具平台和程序库

----------------------------------------------------------------------

在看候捷的Win32多线程程序设计,有几个小问题

1、win32多线程程序设计和c多线程有关系吗?有什么区别?底什么是win32多线程编程?CreateThread和_beginthread有什么区别?

2、到底什么是核心对象?好像候捷的书上说的有点矛盾啊,他说createThread传回来的handle被称为核心对象,可看到后来他又说核心对象包括进程、线程、文件等。核心对象到底有什么作用

他书上有段话:_beginthreadex的参数和CreatThread的参数其实完全相同(这句就不明白,完全相同起不同的名字干什么?)不过它把WIN32的数据类型净化了,所谓净化,就是用标准的C数据类型代替windows自定义的数据类型,参数类型被净化,主要是要使这个函数能移植到其他操作系统,理论上净化了win32数据类型之后,_beginthreadex就可以实现于其他平台,因为完全不需要windows.h,但不幸的是还要调用closehandle,所以还要含如windows.h(其他平台下不能调用closehandle?还是其他平台不支持多线程编程?)

可能有的问题比较菜,不过我真的不太懂,希望有人能帮我解答一下,多谢了

----------------------------------------------------------------------

为什么我发的帖子在列表里看不到啊?有人能看到吗?

--------------------------------------------------------

参数用不同的名字只是为了便于理解 ...

--------------------------------------------------------

核心对象就像针对操作系统的全局变量一样,比如你建立的没一个进程,都只有一个系统唯一的进程id号,根据这个id号,也就是所谓的handle,你可以调函数查询倒这个进程在系统里面的情况,比如使用的内存,虚拟内存比列等等。

多线程的实现实际上只是屏蔽了系统的多线程实现而已,标准c的线程和windows库函数的线程底层的实现原理应该是一样的

你看怎么用方便,另外程序如果需要移植等等最好用标c的,因为比如在别的支持标c的系统下面,他同样屏蔽了底层的实现,你可以直接使用

--------------------------------------------------------

核心对象的这些数据,比如空间的占用等等,是规系统直接管理的,所以你只能构通过调函数去访问,而不能得到实际的地址去修改,也许是为了安全的考虑吧。

--------------------------------------------------------

《Win32多线程》这本我也看过,写的不错, 但是很多细节还是没有涉及到。 推荐楼主看看 《Windows核心编程》 有比较详尽的解释。

--------------------------------------------------------

真正的系统API接口是CreateThread; _beginthread是对CreateThread的封装,也就是说_beginthread最终也是需要调用CreateThread来实现多线程的。

也许MS封装了_beginthread的本意是想让_beginthread称为跨平台的多线程标准函数。但是不幸是这个目标并没有实现。现在倒是有一套可移植的跨平台多线程函数库pthread,它在多个unix/linux系统上得到实现。

--------------------------------------------------------

真正的系统API接口是CreateThread; _beginthread是对CreateThread的封装,也就是说_beginthread最终也是需要调用CreateThread来实现多线程的。 ---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------

_beginthreadex调用CreatThread?

我现在的理解就是CreatThread就是windows平台下的,如果_beginthreadex是通过调用createthread来实现的,那么怎么跨平台使用啊?即使别的平台支持_beginthreadex,但是它不支持createThread还不是一样等于_beginthreadex不能跨平台?

--------------------------------------------------------

《Windows核心编程》里有讲到,_beginThread会对c/c++的一些堆栈还有一些参数做一些处理,参见第6章

--------------------------------------------------------

...............

现在,假设在调用s y s t e m函数之后和调用i f语句之前,执行上面代码的线程中断运行,同时假设,该线程中断运行是为了让同一进程中的第二个线程开始执行,而这个新线程将执行另一个负责设置全局变量e r r n o的C运行期函数。当C P U在晚些时候重新分配给第一个线程时,e r r n o的值将不再能够反映调用上面代码中的s y s t e m函数时的错误代码。为了解决这个问题,每个线程都需要它自己的e r r n o变量。此外,必须有一种机制,使得线程能够引用它自己的e r r n o变量,但是又不触及另一个线程的e r r n o变量。

这是标准C / C + +运行期库原先并不是设计用于多线程应用程序的唯一一个例子。在多线程环境中存在问题的C / C + +运行期库变量和函数包括e r r n o、

_ d o s e r r n o、s t r t o k、_ w c s t o k、s t r e r r o r、_ s t r e r r o r、t m p n a m、t m p f i l e、a s c t i m e、_ w a s c t i m e、g m t i m e、_ e c v t和_ f c v t等。

搜索更多关于: 多线程编程(1) 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

(2) 设置信号:在操作共享资源前,打开信号;完成操作后,关闭信号。这类似于互斥体对象的处理。 ---------------------------------------------------------- 首先,创建信号对象: HANDLE CreateSemaphore( ); 或者打开一个信号对象: HANDLE OpenSemaphore( ); 然后,在线程的访问共享资源之前调用WaitForSingleObject。 共享资源访问完后,释放对信号对象的占用: ReleaseSemaphore(); 信号对象允许同时对多个线程共享资源的访问,在创建对象时指定最大可同时访问的线程数。 当一个线程申请访问成功后,信号对象中的计数器减一;调用ReleaseSemaphore函数后,

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com