摘要:
_beginthreadex()函数在创建新线程时会分配并初始化一个_tiddata块。这个_tiddata块自然是用来存放一些需要线程独享的数据。事实上新线程运行时会首先将_tiddata块与自己进一步关联起来。然后新线程调用标准C运行库函数如strtok()时就会先取得_tiddata块的地址再将需要保护的数据存入_tiddata块中。这样每个线程就只会访问和修改自己的数据而不会去篡改其它线程的数据了。因此,如果在代码中有使用标准C运行库中的函数时,尽量使用_beginthreadex()来代替CreateThread() 阅读全文
摘要:
如果使用阻塞的套接字的话,在控制台下还好!如果是WIN32程序的话,那么就容易造成界面的假死,因为接收函数一直等待有消息进来之后才会被返回!所以此时界面一直属于假死的状态,如果你乱动的话,那么就容易真死了。解决办法如下:
第一:使用多线程技术,多线程和SOCKET结合的话,可以使用单独一个线程来接收消息。这样即使接收函数阻塞了也不会影响其他线程,例如界面线程。但是如果使用多线程的话,就必须要考虑到多线程之间同步的问题,以及临界资源的问题。
第二:使用异步套接字。但是使用异步套接字的话,至少要了解一下Windows的消息机制。异步套接字的工作原理是基于Windows消息的,和在MFC中的其他消息函数一样,当有消息的时候,套接字的相关函数就被触发。例如,我们双击的时候,系统感知了这个消息,然后做出响应。异步套接字的工作也是如此,当有网络消息来的时候,接收函数才工作,否则接收函数是不工作的。 阅读全文