x264多线程中的一些问题

x264windows下多线程运行

x264在windows下运行 --threads 2时 发现警告信息,不支持多线程,于是参考http://blog.csdn.net/fanner01/article/details/6325226并进行了详细的描述修改

1. 从http://sourceware.org/pthreads-win32/ 下载pthread的win32版本,点击进去下载zip格式的,便于在windows下解压,

这是个自解压文件,压缩包里的pthreads.2目录是源码,Pre-built.2目录是编译所需的头文件和库文件。把其中的Pre-built.2\dll\x86文件夹下的dll文件复制到D:\Program Files\Microsoft Visual Studio 9.0\VC\bin下,把Pre-built.2\include下的3个头文件复制到D:\Program Files\Microsoft Visual Studio 9.0\VC\include下,把Pre-built.2\lib\x86下的lib文件复制到D:\Program Files\Microsoft Visual Studio 9.0\VC\lib下。

2. 在项目属性的“C/C++ -> 预处理器 ->预处理器”中加入HAVE_PTHREAD,SYS_MINGW。

3. 在osdep.h文件,紧接着#ifdef USE_REAL_PTHREAD加入

#pragma comment(lib, "pthreadVC2.lib")

#ifdef USE_REAL_PTHREAD
#pragma comment(lib, "pthreadVC2.lib")
#define x264_pthread_t               pthread_t
#define x264_pthread_create          pthread_create
#define x264_pthread_join            pthread_join
#define x264_pthread_mutex_t         pthread_mutex_t
#define x264_pthread_mutex_init      pthread_mutex_init
#define x264_pthread_mutex_destroy   pthread_mutex_destroy
#define x264_pthread_mutex_lock      pthread_mutex_lock
#define x264_pthread_mutex_unlock    pthread_mutex_unlock

引用pthreadVC2.lib,重新编译。

其它版本请自己根据可能的编译错误随机应变。调整项目属性意味着同时调整libx264和x264两处的属性。

经过如上调整编译出的X264就可以在--threads n //n>=2的时候用完CPU的潜力了。

为了能够使用新编出的libx264d.lib 点击工具》选项》项目和解决方案》VC++目录选择添加库文件,浏览目录,将生成libx264d.lib的目录添加过去,以避免每回生成lib库都要将其添加至VC的lib目录下的麻烦。

研究了一下x264运用多线程之后,追本溯源,找到了windows下运用pthread的方法

windows 下使用pthread

1、下载库。
地址: 去下载如pthreads-w32-2-8-0-release.exe
这是个自解压文件,压缩包里的pthreads.2目录是源码,Pre-built.2目录是编译所需的头文件和库文件。

2、VS的设置
添加执行库、目录、库文件的路径

a、目录
VC6.0 TOOLS->OPTIONS->DIRECTORY
VS2005 TOOLS->OPTIONS上面说的添加目录的方法
b、库文件pthreadVC2.lib
VC6.0 PROJECT->SETTING->LINK
VS2005 PROJECT->PROPERTY PAGES》链接器>附加依赖项>写上pthreadVC2.lib
(注:也可用#pragma comment(lib, "pthreadVC2.lib")代替

c、动态库文件pthreadVC2.dll
将pthreadVC2.dll拷贝到c:/windows/system32文件夹下

3、测试

// threads.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
void* Function_t(void* Param)
{
	printf("我是线程! ");
	pthread_t myid = pthread_self();
	printf("线程ID=%d ", myid);
	return NULL;
}

int _tmain(int argc, _TCHAR* argv[])
{
	pthread_t pid;
	pthread_attr_t attr;
	pthread_attr_init(&attr);
	pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	pthread_create(&pid, &attr, Function_t, NULL);
	printf("======================================== ");
	getchar();
	pthread_attr_destroy(&attr);

	return 0;
}


4、在VC下使用POSIX标准的线程

POSIX下的很多东西我都很喜欢,其中就包括pthread。不过跟使用socket面临同样的问题,在Linux下调试程序并没有VC下方便。所以,希望在VC下可以pthread写东西,调试没有问题的话可以在各个平台下使用。

在网上找了一些资料,发现VC下使用pthread也是异常简单啊,呵呵,记录下来,备用~~~

有一个叫做POSIX Threads for Win32的项目,专门为win32开发了一个pthread的lib,利用它,可以很方便的在win32下实现pthread的应用。我这里使用到的是2.7.0版本的POSIX Threads for Win32,下载地址:

将下载到的exe解压之后,会得到三个目录:

其中,Pre-built.2中是已经编译好的lib以及dll,同时包含了一些必要的头文件。将其中的include文件夹和lib文件夹copy到VC的安装目录下,例如,我的是VC6.0的环境,默认安装,则,需要copy到:C:\Program Files\Microsoft Visual Studio\VC98

接着,在编程的时候,引入pthreadVC2.lib即可:

   1: #pragma comment(lib, "pthreadVC2.lib")

参考 http://hi.baidu.com/bellgrade/item/d075b431be0364c41b9696d3

你可能感兴趣的:(x264)