雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用CreateThread() 与 _beginthreadex()来创建多线程

Posted on 2014-03-05 16:20  huhuuu  阅读(355)  评论(0)    收藏  举报

CreateThread() 与 _beginthreadex()来创建多线程

CreateThread创建多线程

#include<stdio.h>
#include <process.h>  
#include<windows.h>

DWORD WINAPI ThreadFun(PVOID pM)  { 
    printf("ID:%d   \n",GetCurrentThreadId());
    return 0;
}

int main(){
    printf("test\n");
    HANDLE handle[10];
    
    int i;
    for(i=0;i<=9;i++){
        handle[i] = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
    }
    WaitForSingleObject(handle,INFINITE);  

    return 0;
}

_beginthreadex()来创建多线程

#include<stdio.h>
#include <process.h>  
#include<windows.h>

unsigned int __stdcall ThreadFun(PVOID pM)  { //这里与后面的不同
    printf("ID:%d   \n",GetCurrentThreadId());
    return 0;
}

int main(){
    printf("test\n");
    HANDLE handle[10];
    
    int i;
    for(i=0;i<=9;i++){
        handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
    }
    WaitForSingleObject(handle,INFINITE);  

    return 0;
}

 

_beginthreadex()函数在创建新线程时会分配并初始化一个_tiddata块。这个_tiddata块自然是用来存放一些需要线程独享的数据。事实上新线程运行时会首先将_tiddata块与自己进一步关联起来。然后新线程调用标准C运行库函数如strtok()时就会先取得_tiddata块的地址再将需要保护的数据存入_tiddata块中。这样每个线程就只会访问和修改自己的数据而不会去篡改其它线程的数据了。因此,如果在代码中有使用标准C运行库中的函数时,尽量使用_beginthreadex()来代替CreateThread()。

 

总结:_beginthreadex()有自己的机制保护线程内私有的数据。

参考:http://blog.csdn.net/morewindows/article/details/7421759