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.pswp.cn/news/453956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453956.shtml
英文地址,請注明出處:http://en.pswp.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 用戶管理…