奇奇怪怪的函数01
1、FindResourceA
1 |
|
2、SizeofResource
1 |
|
3、LoadResource
1 |
|
4、__gmpz_init_set_str
1 |
|
5、 mpz_powm
1 |
|
6、 CreateThread
在C/C++中可以通过CreateThread函数在进程中创建线程,函数的具体格式如下:
1 |
|
如果函数调用成功,则返回新线程的句柄,调用WaitForSingleObject
函数等待所创建线程的运行结束。函数的格式如下:
1 |
|
一般情况下需要创建多个线程来提高程序的执行效率,但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对一个内存地址进行写入操作,由于CPU时间调度的问题,写入的数据会被多次覆盖,所以要使线程同步。
就是说,当有一个线程对文件进行操作时,其它线程只能等待。可以通过临界区对象实现线程同步。临界区对象是定义在数据段中的一个CRITICAL_SECTION结构,Windows内部使用这个结构记录一些信息,确保同一时间只有一个线程访问改数据段中的数据。
使用临界区的步骤如下:
(1)初始化一个CRITICAL_SECTION结构;在使用临界区对象之前,需要定义全局CRITICAL_SECTION变量,在调用CreateThread
函数前调用InitializeCriticalSection
函数初始化临界区对象;
(2)申请进入一个临界区;在线程函数中要对保护的数据进行操作前,可以通过调用EnterCriticalSection
函数申请进入临界区。由于同一时间内只能有一个线程进入临界区,所以在申请的时候如果有一个线程已经进入临界区,则该函数就会一直等到那个线程执行完临界区代码;
(3)离开临界区;当执行完临界区代码后,需要调用LeaveCriticalSection
函数离开临界区;
(4)删除临界区;当不需要临界区时调用DeleteCriticalSection
函数将临界区对象删除;
7、 CloseHandle
1 |
|
Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.
1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread
返回到你CloseHandle()
。
2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle
关闭之,如果不这么做,你系统的句柄资源很快就用光了。
3,如果你CreateThread
以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread
等,就要保存这个句柄,使用完了在CloseHandle
。如果你开了一个线程,而不需要对它进行如何干预,CreateThread
后直接CloseHandle
就行了。
所以 CloseHandel(ThreadHandle );
只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。