多线程
1.创建多线程
- Windows下创建一个线程的方法有两种,一种就是调用Windows API CreateThread()来创建线程;另外一种就是调用MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。
- 相应的退出线程也有两个函数Windows API的ExitThread()和CRT的_endthread()。
- 根据Windows API和MSVC CRT的关系,可以看出来_beginthread()是对CreateThread()的包装,它最终还是调用CreateThread()来创建线程。
- _beginthread的对应函数_endthread自动的调用了CloseHandle,而_beginthreadex的对应函数 _endthreadex则没有,所以CloseHandle无论如何都是要调用的不过_endthread可以帮你执行自己不必写,其他两种就需要自己 写!(Jeffrey Richter强烈推荐尽量不用显式的终止函数,用自然退出的方式,自然退出当然就一定要自己写CloseHandle)
(1) _beginthread(myfun, 0, NULL)
(2) CreatThread(NULL, 0, myfun, NULL,0,NULL)
例子:
#include <stdlib.h> #include <Windows.h> #include <process.h> void fun(void *p) { for(int i=0; i<100; i++) { num++; } } int main() { HANDLE hd[100]; for(int i=0; i<100, i++) { hd[i]=_beginthread(myfun, 0, NULL); //数组的每一个元素都是一个线程 //WaitForSingleObject(hd[i], INFINITE); //同步,完成一个线程,在进行下一个
。表示该线程不结束,不会开始下一步 } WaitForMultipleObjects(100, hd, TRUE, INFINITE); //等待所有线程退出 printf("%d", num); system("pause"); }
同步线程有一个问题,如果一个线程的运行时间很长,那么全部完成,需要花费很长时间。
并行进行,不同步运行多个线程,最后得到的结果是不精确的
2.计时函数(头文件time.h)
void main()
{
time_t start, end;
time(&start);
程序语句
time(&end);
printf("%f",difftime(end, start));
}
3.临界区(头文件是Windows.h),
CRITICAL_SECTION cs; //定义全局,起到了控制线程的作用
一般用多线程原则上使用cpp
EnterCriticalSection(&cs); //进入临界区
LeaveCriticalSection(&cs); //离开临界区
临界区他不是一个变量,它是调用操作系统,让线程进入临界区,锁定一个变量。
beginthread你只能让他互锁,你如果想让他不发生冲突,需要另一种创建线程的方法,creatthread,它是windows内部的,参数比较多。
DWORD WINAPI myfun(void *) //这里的WINAPI表明是申请的操作系统所调度的这么个线程。
{
for(int i=0; i<100, i++)
{
EnterCriticalSection(&cs);
num++;
LeaveCriticalSection(&cs);
}
}
DeleteCriticalSection(&cs);
人怂胆子小,手拿大刀跑。