c++ 多執行緒程式設計入門 訊號量使用
1、pthread_create函式定義
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg);
引數1:指向執行緒識別符號指標。
引數2:執行緒屬性。
引數3:執行緒執行函式起始地址。
引數4:執行函式的引數。
建立執行緒成功時,函式返回0,若不為0則說明建立執行緒失敗,常見的錯誤返回程式碼為EAGAIN和EINVAL。前者表示系統限制建立新的執行緒,例如執行緒數目過多了;後者表示第二個引數代表的執行緒屬性值非法。
2、pthread_join函式定義
程式碼中如果沒有pthread_join主執行緒會很快結束從而使整個程序結束,從而使建立的執行緒沒有機會開始執行就結束了。加入pthread_join後,主執行緒會一直等待直到等待的執行緒結束自己才結束,使建立的執行緒有機會執行。
3、原始碼包含pthread標頭檔案
程式設計實現三個執行緒ABC,並讓它們順次列印ABC這裡是一道題的兩種解法
include <pthread.h>
#include <stdio.h> #include <iostream> #include <sys/types.h> #include <semaphore.h> #include <pthread.h> using namespace std; sem_t sem_id1,sem_id2,sem_id3; void *func1 (void*) {sem_wait(&sem_id1);printf("A\n");sem_post(&sem_id2);} void *func2 (void*) {sem_wait(&sem_id2);printf("B\n");sem_post(&sem_id3);} void *func3 (void*) {sem_wait(&sem_id3);printf("C\n");sem_post(&sem_id1);} int main(){ sem_init(&sem_id1, 0, 1); sem_init(&sem_id2, 0, 0); sem_init(&sem_id3, 0, 0); pthread_t pthread_id1, pthread_id2, pthread_id3; pthread_create(&pthread_id1, NULL, func1, NULL); pthread_create(&pthread_id2, NULL, func2, NULL); pthread_create(&pthread_id3, NULL, func3, NULL); pthread_join(pthread_id1, NULL); cout<<1<<endl; pthread_join(pthread_id1, NULL); cout<<2<<endl; pthread_join(pthread_id1, NULL); cout<<3<<endl; return 0; } // #include <stdio.h> // #include <pthread.h> // void *secondFunc(void *); // void *thirdFunc(void *); // void *firstFunc(void *args) // { // pthread_t id2; // pthread_create(&id2,NULL,&secondFunc,NULL); // pthread_join(id2,NULL); // printf("C\n"); // } // void *secondFunc(void *args) // { // pthread_t id3; // pthread_create(&id3,NULL,&thirdFunc,NULL); // pthread_join(id3,NULL); // printf("B\n"); // } // void *thirdFunc(void *args) // { // printf("A\n"); // } // int main() // { // pthread_t id1; // pthread_create(&id1,NULL,&firstFunc,NULL); // pthread_join(id1,NULL); // return 0; // }
4、編譯執行多執行緒程式
編譯上述多執行緒程式,必須使用 -lpthread編譯選項,因為pthread庫不是Linux預設連結庫,連結時必須指定使用libpthread.a庫(天緣機子ubuntu11.10這些庫在/usr/lib/i386-linux-gnu路徑下),在編譯選項中需新增-lpthread引數,示例如:
C編譯選項:
>gcc test.c -o test -lpthread
C++編譯選項:
>g++ ctest.cpp test.cpp -o test -lpthread
如果是寫到MAKEFILE中,可以找到類似TARG_OPTIONS=這樣的位置新增-lpthread。
但是往往還是會報告pthread_create未宣告問題,說明編譯器仍未找到libpthead.a的位置,這時可手動在編譯命令列中新增:-L./usr/lib/i386-linux-gnu 選項(這裡的路徑是libthread.a路徑,不同系統、機子可能有所不同!!)。
執行:
>./test
cmake寫法
ADD_EXECUTABLE(thread thread.cpp)
TARGET_LINK_LIBRARIES(thread -lpthread )
加一個連結 -lpthread
相關推薦
c++ 多執行緒程式設計入門 訊號量使用
1、pthread_create函式定義 int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void
C++多執行緒 互斥鎖 訊號量 事件 臨界區
一、互斥鎖 1、先熟悉熟悉API 1,建立互斥鎖,並反正一個控制代碼 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指
多執行緒 之Semaphore 訊號量控制
Semaphore(訊號量) 用來控制同時訪問特定資源的執行緒數量。可以起到限流的作用。它與之前寫到的Guava API 中的令牌桶 RateLimiter的區別在於,令牌桶是控制了最終能進入訪問資源的恆定流量。會拋棄掉一些過剩流量的進入。而Semaphore 保證的是進入流量的恆定速率,這些流量最
理解c++多執行緒程式設計
多執行緒程式設計 本篇博文不是主要介紹互斥鎖之類的,是理解執行緒的執行,以便以後有把握的寫多執行緒程式。 #include<thread> #include<iostream&g
Linux c多執行緒程式設計的4個例項
在主流的作業系統中,多工一般都提供了程序和執行緒兩種實現方式,程序享有獨立的程序空間,而執行緒相對於程序來說是一種更加輕量級的多工並行,多執行緒之間一般都是共享所在程序的記憶體空間的。 Linux也不例外,雖然從核心的角度來看,執行緒體現為一種對程序的"克隆"(clon
Linux多執行緒程式設計入門
1 執行緒基本知識 程序是資源管理的基本單元,而執行緒是系統排程的基本單元,執行緒是作業系統能夠進行排程運算的最小單位,它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同
Java多執行緒-新特徵-訊號量Semaphore
簡介 訊號量(Semaphore),有時被稱為訊號燈,是在多執行緒環境下使用的一種設施, 它負責協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。 概念 Semaphore分為單值和多值兩種,前者只能被一個執行緒獲得,後者可以被若干個執行緒獲得。 以一個停車場
java多執行緒程式設計入門之鎖的使用
package com.CUPK.lsz.TraditionalThread; //實現互斥的第一種方法:作為定義詞修飾程式碼 public class TraditonalThreadSynchronized1 { final Outputer outputer = new Outputer(
java多執行緒程式設計入門
package com.CUPK.lsz; public class TraditionalThread { public static void main(String[] args) { /* * 方法一: */ // 定義一個子類物件 Thread thread
C#多執行緒程式設計筆記(5.2)-在lambda表示式中使用await操作符
近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading.Tasks; using System.Threading; namespace 在Lam
Linux C 多執行緒程式設計總結
執行緒的資料處理 和程序相比,執行緒的最大優點之一是資料的共享性,各個程序共享父程序處沿襲的資料段,可以方便的獲得、修改資料。但這也給多執行緒程式設計帶來了許多問題。我們必須當心有多個不同的程序訪問相同的變數。許多函式是不可重入的,即同時不能執行一個函式的多個拷貝(除非使用不同的資料段)。在函式中宣告的
【C++多執行緒程式設計學習(1)】-CPU個數、CPU核心數、CPU執行緒數
轉自:CPU個數、CPU核心數、CPU執行緒數(by kimsimple) CPU個數即CPU晶片個數。 CPU核心數是指物理上,也就是硬體上存在著幾個核心。比如,雙核就是包括2個相對獨立的CPU核心單元組,四核就包含4個相對獨立的CPU核心單元組。 CPU執行緒數是一
【Linux C 多執行緒程式設計】互斥鎖與條件變數
一、互斥鎖互斥量從本質上說就是一把鎖, 提供對共享資源的保護訪問。 1. 初始化: 在Linux下, 執行緒的互斥量資料型別是pthread_mutex_t. 在使用前, 要對它進行初始化: 對於靜態分配的互斥量, 可以把它設定為PTHREAD_MUTEX_INITIA
樹莓派3B Linux下C++多執行緒程式設計
下面的程式碼手動建立了兩個執行緒,一個執行緒是讀取串列埠的資料,另一個執行緒是通過UDP來讀取網路通訊收到的資料。加上main函式的執行緒,一共三個執行緒。 先簡單講一下多執行緒的建立, pthread_t serial; int ser =
C++——多執行緒程式設計(二)std::mutex 執行緒同步、解決資源競爭問題
前言 執行緒同步 這裡的“同”不是同時、一起執行的意思,而是指協同、協助、互相配合。執行緒同步是指多個執行緒協同步調,按預定的先後次序進行執行。 執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;
windows C++多執行緒程式設計高階篇 實現執行緒同步
上一篇文章windows程式設計 使用C++實現多執行緒類僅僅是介紹了怎樣用類來實現多執行緒,這篇文章則重點介紹多執行緒中資料同步的問題。好了,廢話不多說,進入主題。 問題場景:這裡我們假設有這樣一個工作流水線(CWorkPipeline),它不斷的生成一
c# multi thread programming ,c# 多執行緒程式設計
使用函式代表(委託)的BeginInvoke()和EndInvoke()方法。可以在新開的執行緒上執行函式,並且在主執行緒得到函式的返回值。 using System; using System.Threading; namespace MultiThread { pub
C#多執行緒程式設計筆記(5.5)-處理非同步操作中的異常
近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^本篇將描述在C#中使用非同步函式時如何處理異常。我們將學習對多個並行的非同步操作使用await時如何聚合異常。using System; using System.T
Linux C++多執行緒程式設計
1.介紹 相比程序,多執行緒是一種節儉的多工操作方式。在Linux系統下,啟動一個新的程序必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段。而執行一個程序中的多個執行緒,它們彼此之間使用相同的地址空間,共享大部分資料,啟動一個
C#多執行緒程式設計筆記(2.5)-使用CountDownEvent類
近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace CountDownEvent_Test { class Pr