在以前学习多线程的过程中,遇到了无法添加包含pthread.h头文件的情况。本文主要简单总结一下这种问题的解决方法。我的编译环境是vs2010。
1. 下载文件
首先,从链接ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-8-0-release.exe下载pthreads-w32-2-8-0-release.exe文件,下载完成后双击运行,出现如下界面
依次点击Browse选择目标路径(即释放路径,此路径无关紧要,桌面也可),然后点击Extract提取文件,之后就在设置的目标路径下得到了如下三个文件夹:
2. 然后打开Pre-built.2文件夹,将这个文件夹中include中的文件复制到vs2010安装目录中vc/include目录下,将lib中的文件复制到vc/lib目录下。如果此时不做其他修改,可能还会提示错误 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决方法有两种:
方法一:
是嵌入清单的问题,于是对该工程以及所有依赖工程进行如下操作
右键->工程属性->配置属性-> 清单工具->输入和输出->嵌入清单,选择[否]
1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
1>CVTRES : fatal error CVT1100: 资源重复。类型: MANIFEST,名称: 1,语言: 0x0409
这个是由于日志文件引起的,可以将
项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。
或者将
项目\属性\配置属性\链接器\清单文件\生成清单:原来是“是”,改成“否”。
方法二(这个方法成功率比较高):
复制 C:\Windows\winsxs\x86_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7601.17514_none_ba1c770af0b2031b 目录下的 cvtres.exe 到C:\Program Files\Microsoft Visual Studio 10.0\VC\bin 目录下,直接覆盖替换。
3. 在解决了这个问题之后,需要在main.app中加入以下两行代码以防止其他问题:
#pragma warning(disable:4716)
#pragma comment(lib, "pthreadVC2.lib")
为了防止出现下图所示的问题,需要将Pre-built.2文件夹中lib目录下的文件复制到工程目录下,如下所示(里面有一些非必要文件):
4. 到此,所有的常见问题得到基本解决,以下面代码为例跑一段例程序:
#include <iostream>
#include <pthread.h> //多线程相关操作头文件,可移植众多平台
#pragma warning(disable:4716)
using namespace std;
#define NUM_THREADS 5 //线程数
void* say_hello(void* args)
{
cout << "hello..." << endl;
} //函数返回的是函数指针,便于后面作为参数
int main()
{
pthread_t tids[NUM_THREADS]; //线程id
for (int i = 0; i < NUM_THREADS; ++i)
{
int ret = pthread_create(&tids[i], NULL, say_hello, NULL); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数
if (ret != 0) //创建线程成功返回0
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
//pthread_exit(NULL); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态
system("pause");
return 0;
}
运行结果如下: