1. 程式人生 > >c++ 多執行緒程式設計入門 訊號量使用

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