windows下使用pthread库

最近在看《C++多核高级编程》这本书,收集了些有用的东西,方便在windows下使用POSIX标准进行Pthread开发,有利于跨平台。

--------------------------------------------------
windows下使用pthread库时间:2010-01-27 07:41来源:罗索工作室 作者:落鹤生 点击:1220次

我听很多人都说pthreads对Windows的兼容性不好,但我又没用过,也根本不知道到底好,还是不好,只不过我看ffmpeg都有在用pthreads,而做流媒体的话ffmpeg是必不可少的,那是否ffmpeg选错了,它该怎么搞一套类似pthreads的东西出来呢?问题是它没有。所以我想试试看。

1 下载库

建议大家下载:ftp://sources.redhat.com/pub/pthreads-win32/这个自解压文件,压缩包里的pthreads.2目录是源码,Pre-built.2目录是编译所需的头文件和库文件。

如果要自行编译请看这里:

使用微软的CL来编译:
rem cl.bat
cl.exe main.cpp /c /I"c:/pthreads-w32-2-7-0-release/Pre-built.2/include"
link.exe /out:main_cl.exe main.obj /LIBPATH:"c:/pthreads-w32-2-7-0-release/Pre-built.2/lib" pthreadVC2.lib
pause

或者使用GCC来编译:
rem gcc.bat
g++.exe -o main.o -c main.cpp -I"c:/pthreads-w32-2-7-0-release/Pre-built.2/include"
g++.exe -o main_gcc.exe main.o "c:/pthreads-w32-2-7-0-release/Pre-built.2/lib/libpthreadGC2.a"
pause

嘿嘿!开源就是好啊,跨平台实现得如此容易


2 vc的设置

添加执行库、目录、库文件的路径;

01. //main.cpp
02. #include <stdio.h>
03. #include <pthread.h>
04. #include <assert.h>
05.
06. void* Function_t(void* Param)
07. {
08.      printf("我是线程! ");
09.      pthread_t myid = pthread_self();
10.      printf("线程ID=%d ", myid);
11.      return NULL;
12. }
13.
14. int main()
15. {
16.      pthread_t pid;
17.      pthread_attr_t attr;
18.      pthread_attr_init(&attr);
19.      pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);
20.      pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
21.      pthread_create(&pid, &attr, Function_t, NULL);
22.      printf("======================================== ");
23.      getchar();
24.      pthread_attr_destroy(&attr);
25.      return 1;
26. }
3 测试

编写程序,添加项目中库文件,编译运行即可。

2:在VC下使用POSIX标准的线程

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

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

有一个叫做POSIX Threads for Win32的项目,专门为win32开发了一个pthread的lib,利用它,可以很方便的在win32下实现pthread的应用。我这里使用到的是2.8.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")

剩下的步骤,就和Linux下一样了,尽情享用吧^_^

 

-------------------------------------

Windows中的pthread程序(2009-06-23 19:47:56)
转载

闲着没事做,找了点pthread-win32的资料看了看,写了个无聊的程序。pthread的使用倒没有什么,倒是注意到了两个细节问题:

    1 在微软的编译器中,可以在头文件开始处加#pragma once,防止文件被包含两次。它与更通用的#ifdef稍微不同,仅用于微软的编译器,它防止一个物理文件被包含两次,却不能防止相同内容的不同文件被包含两次。当然,这不是问题,相同内容包含两次会出编译错误的。

    2 在多线程程序中,应该使用多线程的C运行时库。有两种方法来实现:

   (1)在工程设置对话框中,选择【C/C++】选项卡,再在【Use run-time library】下拉列表中选择多线程库

   (2)使用预处理命令。我是摸索了一会儿才发现正确的方法的:

    #pragma comment(linker,"/NODEFAULTLIB:libcd /DEFAULTLIB:libcmt")

  
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <pthread.h>

#include "myheader.h"
#include "myheader.h"

#pragma comment(lib,"pthreadVSE2")
#pragma comment(linker,"/NODEFAULTLIB:libcd /DEFAULTLIB:libcmt")

#define THREAD_NUM  10

static pthread_cond_t    g_cond;
static pthread_mutex_t   g_mutex;
static int     g_index_wakeup;
static int     g_exit_count;

typedef struct
{
    pthread_key_t key;
    int index;
    int num;
}THREAD_DATA;

static void destroy_key(void* p)
{
    THREAD_DATA* p_data;
    p_data = (THREAD_DATA*)p;
    printf("### thread %2d destroy key ###/n",p_data->index);
    free(p);
    if (++g_exit_count == THREAD_NUM)
    {
        pthread_cond_broadcast(&g_cond);
    }
}

static void* thread_proc(void* p)
{
    THREAD_DATA* p_data;

    p_data = (THREAD_DATA*)p;
    if (0 != pthread_key_create(&(p_data->key),destroy_key)) return NULL;
    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;
        }
        else if (p_data->index == g_index_wakeup)
        {
            printf("thread %d: the num is %d now./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);
    }
    return NULL;
}

int main(int argc,char* argv[])
{
    pthread_t pid;
    pthread_attr_t attr;
    THREAD_DATA* p_data;
    int cur;

    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_wakeup < 0) || (g_index_wakeup > THREAD_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### Wake up thread %d ###/n",g_index_wakeup);
            pthread_mutex_unlock(&g_mutex);
        }
    }

    pthread_mutex_destroy(&g_mutex);
    pthread_cond_destroy(&g_cond);

    return 0;
}
 
---------------------------------------------------------------------------------

error LNK2005: xxx already defined in libcmt.lib(xxx.obj) MSVCRT.lib 
参考:
 
这个错误是微软设计错误,因此如果遇到这个错误,我们只能躲过这个链接错误。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。MS, C有两种C函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误。因此建议使用支持多线程的msvcrt.lib。
 
需要注意的是,当使用其他的库的时候最容易产生这种错误,例如boost和wxWindow使用/MD来编译的,也就是使用支持多线程的C函数库。这时候如果自己的程序没有指明/MD的话,就会提示两种C函数冲突,并且还有LNK2005错误。因此如果使用boost,wxWindow的话,需要指明/MD。

msvcrt.lib是VC中的Multithreaded DLL 版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文件用了Multithreaded DLL版本,而其他文件用了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
Multithreaded using DLL (msvcrt.lib) libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
Debug Single-threaded (libcd.lib) libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
Debug Multithreaded (libcmtd.lib) libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib
Debug Multithreaded using DLL (msvcrtd.lib) libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
 
这个在C++ ->Code Generation-->runtime library 中设置,实际上和静态dll和动态dll有关
 
解决办法:
 
Project Settings: 
-> Configration Properties -> Linker -> Input -> Ignore Specific Library: libcmtd


libcmtd 这个库有时候不能忽略,忽略后会有不能解析的外部符号错误
其实有个方便的方法 链接时加入参数 /FORCE:MULTIPLE 
-------------------------------------------------------------------------------------------

 

google一下POSIX Threads for Win32,就可以得到这个开源库了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day 05 多行输出与多行注释、字符串的格式化输出、预设创建者和日期

msg"hello1 hello2 hello3 " print(msg) 显示结果为&#xff1a; # " "只能进行单行的字符串 多行字符串用 ,前面设置变量&#xff0c;可以用 表示多行 msghello1 hello2 hello3print(msg) 显示结果为&#xff1a; 当然如果没有设置变量&#xff0c;…

python数值计算guess_【python】猜数字game,旨在提高初学者对Python循环结构的使用...

import random #引入生成随机数的模块需求&#xff1a;程序设定生成 1-20 之间的一个随机数&#xff0c;让用户猜日期&#xff1a;2019-10-21作者&#xff1a;xiaoxiaohui目的&#xff1a;猜数字game&#xff0c;旨在提高初学者对Python 变量类型以及循环结构的使用。secretNu…

调试九法-总体规则

调试规则规则1 理解系统规则2 制造失败规则3 不要想&#xff0c;而要看规则4 分而治之规则5 一次只改一个地方规则6 保持审计跟踪规则7 检查插头规则8 获得全新观点规则9 如果你不修复bug&#xff0c;它将依然存在转载于:https://www.cnblogs.com/uetucci/p/7987805.html

深度学习之循环神经网络(Recurrent Neural Network,RNN)

递归神经网络和循环神经网络 循环神经网络&#xff08;recurrent neural network&#xff09;&#xff1a;时间上的展开&#xff0c;处理的是序列结构的信息&#xff0c;是有环图递归神经网络&#xff08;recursive neural network&#xff09;&#xff1a;空间上的展开&#…

从北京回来的年轻人,我该告诉你点什么?

前言 就在上周末&#xff0c;我与公众号里的一个当地粉丝见面了&#xff0c;一起吃了顿饭&#xff0c;顺便聊了聊。先来简单交代下我们这位粉丝&#xff08;以下简称小L&#xff09;的经历以及诉求。 小L之前在北京八维研修学院培训的PHP&#xff0c;因为家庭原因&#xff0c;没…

Linphone编译【转载】

Linphone依赖太多的库&#xff0c;以致于稍有疏失&#xff0c;就会在编译&#xff0c;运行出错&#xff0c;都是由于依赖库安装的问题。 1 基础知识 1.1 动态库的连接 很多人安装完库后&#xff0c;configure依然报告这个库没有。这是对linux动态库知识匮乏造成&#xff0c;也就…

python助教的面试题_python面试题----持续更新中

为什么学习Python&#xff1f;通过什么途径学习的Python&#xff1f;Python和Java、PHP、C、C#、C等其他语言的对比&#xff1f;python 解释型语言&#xff0c;语法简洁优雅。C C 编译型语言&#xff0c;先编译后运行&#xff0c;偏底层。简述解释型和编译型编程语言&#xff1…

python3模块: requests

Python标准库中提供了&#xff1a;urllib等模块以供Http请求&#xff0c;但是&#xff0c;它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作&#xff0c;甚至包括各种方法覆盖&#xff0c;来完成最简单的任务。 发送GET请求 import urllib.requestf…

SUSE12系统安装及LVM设置详解

SUSE12自定义安装跟以往版本差不多&#xff0c;只是调整了一些功能安装顺序&#xff0c;例如网络设置放到很靠前&#xff0c;SUSE11的时候几乎是在后半部分&#xff0c;自定义分区也调整到网络设置之后&#xff0c;入口设置也隐秘&#xff0c;如果是熟悉suse11安装&#xff0c;…

在windows下编译FFMPEG-最新2009版本

转】在windows下编译FFMPEG-最新2009版本2010-11-17 18:50大家可以看到&#xff0c;此篇之前有很多个版本的“在windows下编译FFMPEG”&#xff0c;那些都是我在网上搜罗来的&#xff0c;在看了无数篇那些过期的、有借鉴价值的文章后&#xff0c;我终于成功在windows下编译出了…

CentOS7 安装nginx

1、官网下载安装包 官网&#xff1a;http://nginx.org/en/download.html 选择适合Linux的版本&#xff0c;这里选择最新的版本&#xff0c;下载到本地后上传到服务器或者centos下直接wget命令下载。 切换到/usr/local目录&#xff0c;下载软件包 # cd /usr/local # wget htt…

dvwa如何打开_DVWA详细 安装

Wamp就是Windows Apache Mysql PHP集成安装环境&#xff0c;即在window下的apache、php和mysql的服务器软件。PHP扩展、Apache模块&#xff0c;开启/关闭鼠标点点就搞定&#xff0c;再也不用亲自去修改配置文件了&#xff0c;WAMP它会去做。再也不用到处询问php的安装问题了&am…

CentOS7安装OpenFire

下载openfire wget http://download.igniterealtime.org/openfire/openfire-3.9.3-1.i386.rpm安装openfire yum install -y /home/openfire-3.9.3-1.i386.rpm安装运行库 yum install -y glibc.i686添加开启启动 chkconfig openfire on启动openfire服务 systemctlstart openfire…

CentOS 安装 php

大致步骤&#xff1a;下载–解压–编译–安装–配置 php官网&#xff1a; https://www.php.net/releases/ php5.6连接地址 http://hk1.php.net/get/php-5.6.36.tar.gz/from/this/mirror http://hk2.php.net/get/php-5.6.36.tar.gz/from/this/mirror 1.安装php 所依赖的软件 yu…

怎么利用ffmpeg和AviSynth给在windows下面为flv文件加水印

之前一直在找怎么为flv文件加上自己的水印,ffmpeg和vhook是在linux下面支持.在windows下面不支持.所以我就选择用ffmpeg和AviSynth为flv文件加水印.详细步骤如下: 1 首先当然下载ffmpeg和AviSynth了.具体的地址自己google一下就能找到很多.这里就不再详细介绍了. 一般情况ffm…

【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存/乐观悲观锁等优化算法)...

1. 循环分页或者循环进行部分读取处理数据的时候&#xff0c;使用 session.clear() ; 2. 对应1N&#xff08;N1&#xff09;问题使用如下解决方式&#xff1a; 1&#xff09;&#xff1a; 使用createCriteria进行查询(join fetch) 2&#xff09;&#xff1a;HQL -> joi…

vscode中安装webpack_VSCode下手动构建webpack项目(示例代码)

1.执行npm install nrm -g&#xff0c;安装nrm&#xff0c;此模块主要用于切换npm镜像源&#xff0c;简化手动配置步骤2.执行 nrm ls&#xff0c;可以看到npm源地址列表&#xff0c;当前使用的是默认源&#xff0c;npm https://registry.npmjs.org/3.执行 nrm use taobao&#…

Python html 代码转成 word(docx)

安装 sudo apt install pandoc pip3 install pypandoc示例代码 import pypandochtml """ <h3>This is a title</h3> <p><img src"http://placehold.it/150x150" alt"I go below the image as a caption"></p…

最新ffmpeg编译和用eclipse进行源码调试

最近由于项目需要&#xff0c;必须修改ffmpeg的源码进行修改才能满足项目的需求&#xff0c;但以前我从来没有自己去编译和使用ffmpeg的源代码&#xff0c;一直都是用别人编译好了的sdk&#xff0c;再加上习惯了vs方便的编译环境&#xff0c;要在linux下对如此多的源代码进行编…

Django补充知识点——用户管理

内容概要 1、Form表单2、Ajax3、布局&#xff0c;Django母板4、序列化5、Ajax相关6、分页7、XSS攻击8、CSRF9、CBV、FBV 10、类中用装饰器的两种方法 11、上传文件 12、数据库正向查询、反向查询、多对多查询 13、jQuery对象和DOM对象可以互相转换 14、cookie和session 用户管理…