闲着没事做,找了点pthread-win32的资料看了看,写了个无趣的程序。pthread的使用倒没有哪些,倒是注意到了两个细节问题:
1在谷歌的编译器中,可以在头文件开始处加#pragmaonce,避免文件被包含两次。它与更通用的#ifdef稍为不同,仅用于谷歌的编译器,它避免一个数学文件被包含两次,却不能避免相同内容的不同文件被包含两次。其实,这不是问题,相同内容包含两次会出编译错误的。
2在多线程程序中,应当使用多线程的C运行时库。有两种方式来实现:
(1)在工程设置对话框中,选择【C/C++】选项卡,再在【Userun-timelibrary】下拉列表中选择多线程库
(2)使用预处理。我是摸索了一会儿才发觉正确的方式的:
#pragmacomment(linker,"/NODEFAULTLIB:libcd/DEFAULTLIB:libcmt")
#include
#include
#include
#include
#include"myheader.h"
#include"myheader.h"
#pragmacomment(lib,"pthreadVSE2")
#pragmacomment(linker,"/NODEFAULTLIB:libcd/DEFAULTLIB:libcmt")
#defineTHREAD_NUM10
staticpthread_cond_tg_cond;
staticpthread_mutex_tg_mutex;
staticintg_index_wakeup;
staticintg_exit_count;
typedefstruct
pthread_key_tkey;
intindex;
intnum;
}THREAD_DATA;
staticvoiddestroy_key(void*p)
THREAD_DATA*p_data;
p_data=(THREAD_DATA*)p;
printf("###thread%2ddestroykey###/n",p_data->index);
free(p);
if(++g_exit_count==THREAD_NUM)
pthread_cond_broadcast(&g_cond);
staticvoid*thread_proc(void*p)
THREAD_DATA*p_data;
p_data=(THREAD_DATA*)p;
if(0!=pthread_key_create(&(p_data->key),destroy_key))returnNULL;
pthread_setspecific(p_data->key,p_data);
srand(time(NULL)+(int)p);
p_data->num=rand();
while(1)
p_data=(THREAD_DATA*)pthread_getspecific(p_data->key);
pthread_mutex_lock(&g_mutex);
if(-100==g_index_wakeup)
pthread_mutex_unlock(&g_mutex);
break;
elseif(p_data->index==g_index_wakeup)
printf("thread%d:thenumis%dnow./n",p_data->index,p_data->num);
p_data->num+=rand();
g_index_wakeup=-1;
pthread_cond_broadcast(&g_cond);
pthread_mutex_unlock(&g_mutex);
Sleep(50);
returnNULL;
intmain(intargc,char*argv[])
pthread_tpid;
pthread_attr_tattr;
THREAD_DATA*p_data;
intcur;
pthread_mutex_init(&g_mutex,NULL);
pthread_cond_init(&g_cond,NULL);
g_index_wakeup=-1;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
for(cur=0;cur<THREAD_NUM;cur++)
p_data=(THREAD_DATA*)malloc(sizeof(THREAD_DATA));
p_data->index=cur+1;
pthread_create(&pid,&attr,thread_proc,p_data);
pthread_attr_destroy(&attr);
srand(time(NULL));
cur=0;
while(1)
pthread_mutex_lock(&g_mutex);
if(-1!=g_index_wakeup)
pthread_cond_wait(&g_cond,&g_mutex);
do
g_index_wakeup=rand()%THREAD_NUM+1;
}while((g_index_wakeupTHREAD_NUM));
if(++cur>THREAD_NUM)
g_exit_count=0;
g_index_wakeup=-100;
printf("/n/n");
pthread_cond_wait(&g_cond,&g_mutex);
pthread_mutex_unlock(&g_mutex);
break;
else
printf("/n###Wakeupthread%d###/n",g_index_wakeup);
pthread_mutex_unlock(&g_mutex);
pthread_mutex_destroy(&g_mutex);
pthread_cond_destroy(&g_cond);
return0;
---------------------------------------------------------------------------------
errorLNK2005:xxxalreadydefinedinlibcmt.lib(xxx.obj)MSVCRT.lib
参考:
这个错误是谷歌设计错误,因而假如碰到这个错误,我们只能逃过这个链接错误。具体的办法就是将那种提示出错的库放在另外一个库的后面。另外选择不同的C函数库,可能会导致这个错误。MS,C有两种C函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。假如一个工程里,这两种函数库混和使用,可能会导致这个错误。为此建议使用支持多线程的msvcrt.lib。
须要注意的是linux查看pthread库版本,当使用其他的库的时侯最容易形成这些错误,比如boost和wxWindow使用/MD来编译的linux查看pthread库版本,也就是使用支持多线程的C函数库。这时侯假如自己的程序没有指明/MD的话,还会提示两种C函数冲突linux内存管理,而且还有LNK2005错误。因而假如使用boost,wxWindow的话,须要指明/MD。
msvcrt.lib是VC中的MultithreadedDLL版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。假如某一文件用了MultithreadedDLL版本linux安装,而其他文件用了Single-Threaded或则Multithreaded版本的库,也就是说用了不同的库,都会造成这个警告的出现。
VC中的C运行时库一共有6种
Single-threaded(libc.lib)libcmt.lib,msvcrt.lib,libcd.lib,libcmtd.lib,msvcrtd.lib
Multithreaded(libcmt.lib)libc.lib,msvcrt.lib,libcd.lib,libcmtd.lib,msvcrtd.lib
MultithreadedusingDLL(msvcrt.lib)libc.lib,libcmt.lib,libcd.lib,libcmtd.lib,msvcrtd.lib
DebugSingle-threaded(libcd.lib)libc.lib,libcmt.lib,msvcrt.lib,libcmtd.lib,msvcrtd.lib
DebugMultithreaded(libcmtd.lib)libc.lib,libcmt.lib,msvcrt.lib,libcd.lib,msvcrtd.lib
DebugMultithreadedusingDLL(msvcrtd.lib)libc.lib,libcmt.lib,msvcrt.lib,libcd.lib,libcmtd.lib
这个在C++->CodeGeneration-->runtimelibrary中设置,实际上和静态dll和动态dll有关
解决办法:
ProjectSettings:
->ConfigrationProperties->Linker->Input->IgnoreSpecificLibrary:libcmtd
libcmtd这个库有时侯不能忽视,忽视后会有不能解析的外部符号错误
虽然有个便捷的方式链接时加入参数/FORCE:MULTIPLE
-------------------------------------------------------------------------------------------
google一下POSIXThreadsforWin32,就可以得到这个开源库了。
本文原创地址://gulass.cn/pdsydmysmdsz.html编辑:刘遄,审核员:暂无