首页 > 其他分享 >CreateThread与_beginthreadex

CreateThread与_beginthreadex

时间:2022-11-15 16:32:39浏览次数:50  
标签:函数 CreateThread beginthreadex tiddata 线程 多线程


今天上实验课编写Windows下Socket多线程实验。



机房没有网络,用手机百度之后找到的是CreateThread()函数创建线程。



试着创建了一个多线程的小程序,运行之后也挺成功的。



回到宿舍最后试着将多线程与Socket结合的时候,再次上网查找资料的时候看到很多



关于用_beginthreadex()函数创建线程。



经过比较实验总结了一下,,,



在使用CreateThread()函数创建线程的时候,



if (system("notepad.exe readme.txt") == -1)




{




switch(errno)




{




...//错误处理代码




}




}

某个线程A在执行上面的代码,该线程在调用system()之后且尚未调用switch()语句时另外一个线程B启动了,



这个线程B也调用了标准C运行库的函数,不幸的是这个函数执行出错了并将错误代号写入全局变量errno中。



这样线程A一旦开始执行switch()语句时,它将访问一个被B线程改动了的errno。



这种情况必须要加以避免!因为不单单是这一个变量会出问题,



其它像strerror()、strtok()、tmpnam()、gmtime()、asctime()等函数



也会遇到这种由多个线程访问修改导致的数据覆盖问题。





为了解决这个问题,Windows操作系统提供了这样的一种



解决方案——每个线程都将拥有自己专用的一块内存区域



来供标准C运行库中所有有需要的函数使用。而且这块内存区域的创建



就是由C/C++运行库函数_beginthreadex()来负责的。



_beginthreadex()函数在创建新线程时会分配并初始化一个_tiddata块。



这个_tiddata块自然是用来存放一些需要线程独享的数据。



事实上新线程运行时会首先将_tiddata块与自己进一步关联起来。



然后新线程调用标准C运行库函数如strtok()时就会先取得_tiddata块的地址



再将需要保护的数据存入_tiddata块中。这样每个线程就只会访问



和修改自己的数据而不会去篡改其它线程的数据了。



因此,如果在代码中有使用标准C运行库中的函数时,



尽量使用_beginthreadex()来代替CreateThread()。


标签:函数,CreateThread,beginthreadex,tiddata,线程,多线程
From: https://blog.51cto.com/u_15758326/5853179

相关文章