多线程

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);









posted @ 2016-08-12 15:26  芬乐  阅读(162)  评论(0编辑  收藏  举报