闲着没事做,找了点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);

怎么查看启明星辰特征库版本_linux查看pthread库版本

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,就可以得到这个开源库了。

本文原创地址:https://www.linuxprobe.com/pdsydmysmdsz.html编辑:刘遄,审核员:暂无