今天上实验课编写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