首页 > 编程知识 正文

createmutex函数(C CreateThread详解)

时间:2023-05-04 03:17:36 阅读:121250 作者:4621

功能创建器(lpthread attributes : pointer; {安全设置} dw堆栈大小: dword; {堆栈大小} lpstartaddress 3360 tfnthreadstartroutine; {入口函数} lpParameter: Pointer; {函数参数} dwCreationFlags: DWORD; {启动选项} var lpThreadId: DWORD {输出线程id}}:thandle; stdcall; {返回线程句柄}

无法在Windows上创建线程并退出CreateThread函数;

TThread.Create是指首先调用Beginthread (由Delphi定制),然后Beginthread调用CreateThread。

既然已经确立,就应该有解放。 与CreateThread对应的释放函数为3:退出thread。 例如,以下代码3360

procedure tform1. button1click (发送器:主题); beginexitthread(0; {此语句可以退出当前程序,但不建议这样使用}结束;

代码注释:

当前程序是进程,进程是工作环境,线程是工作人员

每个进程都有一个启动线程(或主线程)。 也就是说,之前的大量编码都是写在这个主线程上的。

上的退出thread (0; 就是退出这个主线程;

程序将退出,因为系统不允许没有线程的进程存在

另外, ExitThread函数的自变量是结束代码,该结束代码用于之后的其他函数,这里可以自由赋予无符号整数.这个ExitThread可能会说很容易使用; 其实无论是用API还是用TThread类写多线程,我们都很少用它; 因为:

1、如果直接使用API的CreateThread,则在执行入口函数后自动退出。 不需要退出路线;

2、在TThread类中建立的线程不能再使用ExitThread退出; 使用TThread建立线程时,会同时分配很多资源。 例如,自定义的成员或祖先类(TObject )分配的资源。 在退出线程中退出草时,这些资源不会释放,而是会引起内存泄漏。 Delphi提供了EndThread (其内部调用退出thread ),但这也不需要我们手动操作。 必须手动操作也是麻烦的事情。 因为很多时候不知道线程是什么时候运行的。

除了CreateThread外,还有CreateRemoteThread,可以在其他进程中建立线程。 这不是现在学习的重点。

首先,集中精力贯彻CreateThread的参数吧.反过来,先谈谈CreateThread返回的“线程句柄”.

“手柄”类似于指针,但可以通过指针读写对象。 只需通过句柄使用对象

具有手柄的对象通常是系统级对象(或内核对象)。 给了我方向盘而不是指针,是因为目的只是:“安全”;

用句柄似乎可以做很多事情,但是把句柄提交给某个函数(一般是系统函数)的话,我们就很难知道到现在为止了。其实系统不相信我们。

不管是指针还是句柄,都只是存储器中的小数据,一般用结构来描述。 微软没有公开方向盘结构的详细情况,推测应该包括:

实际指针的地址、访问权限的设定、参照数等

因为CreateThread可以返回句柄,所以线程指示它是内核对象。

无论线程实际属于哪个进程,它们在系统的怀里都是平等的; 如果优先级(后面将详细介绍)相同,则系统会以相同的时间间隔运行每个线程,但这种间隔很小,您可能会误以为程序在不间断地运行。

此时,您应该怀疑:系统在运行其他线程时是如何记住上一个线程的数据状态的。

有这样一种结构的TContext。 这基本上是CPU寄存器的集合,线程在这种结构中切换数据。 可以尝试用GetThreadContext函数读取寄存器。

附加此结构TContext (或: CONTEXT,_CONTEXT )的定义:

PContext=^TContext; _ context=recordcontextflags : dword; Dr0: DWORD; Dr1: DWORD; Dr2: DWORD; Dr3: DWORD; Dr6: DWORD; Dr7: DWORD; 浮动保存: tfloatingsavearea; SegGs: DWORD; SegFs: DWORD; SegEs: DWORD; SegDs: DWORD; Edi: DWORD; Esi: DWORD; Ebx: DWORD; Edx: DWORD; Ecx: DWORD; Eax: DWORD; Ebp: DWORD; Eip: DWORD; SegCs: DWORD; EFlags: DWORD; Esp: DWORD; SegSs: DWORD; 结束;

CreateThread的最后一个参数是“线程的ID”;

既然可以返回句柄,为什么还要输出这个ID? 我现在知道的是:

1、线程ID唯一的句柄可能有多个。 例如,可以在GetCurrentThread中获取伪句柄,可以在DuplicateHandle中复制句柄。

2、ID比方向盘轻。

在主线程中,GetCurrentThreadId、MainThreadID和MainInstance都获取主线程的ID。

对不起,我说了CreateThread的参数,现在进入下一篇。

线程学习还在入门中,把我的理解写在这里,最期待的成果是收到指正。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。