一句话

来源:互联网 发布:淘宝二级域名有什么用 编辑:程序博客网 时间:2024/04/30 13:02

今天在《Win32多线程程序程序设计》中看到一些原则性的东西:

1、在线程之间尽量保持最小接触面积;

2、将 race conditions 的可能性降到最低;

3、程序代码要有自我防卫意识。

这些东西还待进一步研究实践,不过在里面学到了MTVERIFY宏来处理调试多线程程序,这个很不错,值得学习,贴出来给大家看看:

#pragma comment( lib, "USER32" )#include <crtdbg.h>#ifdef DEBUG#define MTASSERT(a) _ASSERTE(a)#define MTVERIFY(a) if (!(a)) PrintError(#a,__FILE__,__LINE__,GetLastError())#else#define MTASSERT(a) (a)#define MTVERIFY(a) (a)#endif__inline void PrintError(LPTSTR linedesc, LPTSTR filename, int lineno, DWORD errnum){LPTSTR lpBuffer;TCHAR errbuf[256];#ifdef _WINDOWS_TCHAR modulename[MAX_PATH];#elseDWORD numread;#endifFormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,errnum,LANG_NEUTRAL,(LPTSTR)&lpBuffer,0,NULL);wsprintf(errbuf, "\nThe following call failed at line %d in %s:\n\n %s\n\nReason: %s\n", lineno, filename, linedesc, lpBuffer);#ifndef _WINDOWS_WriteFile(GetStdHandle(STD_ERROR_HANDLE), errbuf, strlen(errbuf), &numread, FALSE );Sleep(3000);#elseGetModuleFileName(NULL, modulename, MAX_PATH);MessageBox(NULL, errbuf, modulename, MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);#endifLocalFree(lpBuffer);exit(EXIT_FAILURE);}

每次使用的时候,直接套在你要调试我的函数外面就可了,比如,我要调试建立线程这个函数,就可以这么写:

MTVERIFY( ThreadH[ i ] = CreateThread( 0,0,ThreadFunc,( LPVOID )i, 0, &ThreadId ) );

这样就可以很方便的调试多线程程序了。



原创粉丝点击