1. 程式人生 > >pthread和std::thread中條件變數的使用

pthread和std::thread中條件變數的使用

程式很簡單,使用兩個執行緒對一個全域性變數輪流進行累加。

先來看pthread的版本:

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

pthread_mutex_t lock;
pthread_cond_t cond;

int condition=0;
unsigned long long  g_count=0;

void work1(void * arg)
{
  while (1)
  {
    pthread_mutex_lock(&lock);
    while (condition==1)
    {
      pthread_cond_wait(&cond, &lock);
    }
    condition=1;
    g_count++;
    printf("thread %lld working.current num is %d\n",pthread_self(),g_count);
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);
  }

}

void work2(void * arg)
{
  while (1)
  {
    pthread_mutex_lock(&lock);
    while (condition==0)
    {
      pthread_cond_wait(&cond, &lock);
    }
    condition=0;
    g_count++;
    printf("thread %lld working.current num is %d\n",pthread_self(),g_count);
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);
  }

}

int main(int argc, char const *argv[])
{
  pthread_t t1,t2;
  pthread_mutex_init(&lock, NULL);
  pthread_cond_init(&cond, NULL);

  pthread_create(&t1, NULL, work1, NULL);
  pthread_create(&t2, NULL, work2, NULL);
  pthread_join(t1, NULL);
  pthread_join(t2, NULL);

  pthread_mutex_destroy(&lock);
  pthread_cond_destroy(&cond);
  return 0;
}

接下來是std::thread的版本:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>

using namespace std;
using namespace std::chrono;
mutex mtx;
condition_variable cond;
int condition =0;
long long g_count=0;

void work1()
{
  while (1)
  {
    {
      unique_lock<mutex> lck(mtx);
      while (condition==1)
      {
        cond.wait(lck);
      }
    }

    std::lock_guard<mutex> lkgrd(mtx);
    g_count++;
    cout<<"thread"<<this_thread::get_id()<<"is working. "<<" current num is "<< g_count<<endl;
    condition=1;
    cond.notify_all();
  }

}

void work2()
{
  while (1)
  {
    {
      unique_lock<mutex> lck(mtx);
      while (condition==0)
      {
        cond.wait(lck);
      }
    }

    std::lock_guard<mutex> lkgrd(mtx);
    g_count++;
    cout<<"thread"<<this_thread::get_id()<<"is working. "<<" current num is "<< g_count<<endl;
    condition=0;
    cond.notify_all();
  }

}

int main()
{
  thread t1(work1);
  thread t2(work2);

  t1.join();
  t2.join();
}

實際執行的時候,pthread的版本要快一些。

PS:C++11 中執行緒庫風格與pthread類似。和win32 thread 有區別。win32 thread中沒有條件變數這個概念,與之對應的是事件(EVENT)。

相關推薦

pthreadstd::thread條件變數的使用

程式很簡單,使用兩個執行緒對一個全域性變數輪流進行累加。 先來看pthread的版本: #include <pthread.h> #include <stdio.h> pthread_mutex_t lock; pthread_cond_t con

【併發】多執行緒程式設計條件變數虛假喚醒的討論

轉自:http://blog.csdn.net/puncha/article/details/8493862 From: http://siwind.iteye.com/blog/1469216 From:http://en.wikipedia.org/wiki/S

Linux C語言多執行緒庫Pthread條件變數的的正確用法逐步詳解

(本文的讀者定位是瞭解Pthread常用多執行緒API和Pthread互斥鎖,但是對條件變數完全不知道或者不完全瞭解的人群。如果您對這些都沒什麼概念,可能需要先了解一些基礎知識) Pthread庫的條件變數機制的主要API有三個: int pthread_cond_w

C++:探索std::mapstd::unordered_map的新增操作

std::map和std::unordered_map主要提供如下幾種新增操作: try_emplace ()   (C++17) emplace () insert() [] = 下面給出一段測試程式碼,觀察物件在新增到std::map中時,

C++:探索std::mapstd::unordered_map最高效的新增操作

std::map和std::unordered_map主要提供如下幾種新增操作: try_emplace ()   (C++17) emplace () insert() 下面給出一段測試程式碼,觀察物件在新增到std::map中時,構造物件過程中會有什麼區別: #i

pthreadstd::thread的區別與應用

轉載自:從 pthread 轉換到 std::thread 以前一直都是用pthread的API寫C++的多執行緒程式。雖然很早之前就聽說,從C++11開始,標準庫裡已經包含了對執行緒的支援,不過一直沒有拿來用,最近剛好有空,藉著pthread的經驗學習下std::thread

linux下多執行緒條件變數的用法

使用條件變數最大的好處是可以避免忙等。相當與多執行緒中的訊號。 條件變數是執行緒中的東西就是等待某一條件的發生和訊號一樣以下是說明,條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待"條件變數的條件成立"而掛起;另一個執行緒

C++併發條件變數 std::condition_variable

簡介 這個操作相當於作業系統中的Wait & Signal原語,程式中的執行緒根據實際情況,將自己阻塞或者喚醒其他阻塞的執行緒。 個人認為,條件變數的作用在於控制執行緒的阻塞和喚醒,這需要和鎖進行相互配合,用來實現併發程式的控制。 函式操作 wait和notify

多執行緒 關於條件變數互斥鎖的疑惑(純乾貨)

條件變數的執行過程(虛擬碼) int pthread_cond_wait(&cond,&wait) { int ret = pthread_cond_wait_and unlock(&cond,&wait);//進入

執行緒私有資料TSD——一鍵多值技術,執行緒同步的互斥鎖條件變數

一:執行緒私有資料: 執行緒是輕量級程序,程序在fork()之後,子程序不繼承父程序的鎖和警告,別的基本上都會繼承,而vfork()與fork()不同的地方在於vfork()之後的程序會共享父程序的地址空間,但是有了寫實複製(fork()之後的子程序也不會直接

多執行緒條件變數虛假喚醒(Spurious wakeup)

這是因為可能會存在虛假喚醒”spurious wakeup”的情況。也就是說,即使沒有執行緒呼叫condition_signal, 原先呼叫condition_wait的函式也可能會返回。此時執行緒被喚醒了,但是條件並不滿足,這個時候如果不對條件進行檢查而往下執行,就可能會導致後續的處理出現錯誤。 虛假喚醒

執行緒與互斥鎖(C++11std::threadstd::mutex的用法)

執行緒 0 首先是曾經在MultiCMOS專案中用到的: #include <thread> //包含標頭檔案 class IDataProcessUnit { protected:

VS條件斷點記憶體變數監測

       條件斷點,我們除錯時加斷點單步除錯,但有時一個很大的迴圈,我們只想單步跟蹤最後幾次迴圈,通過條件斷點和斷點命中次數設定,可以方便地讓程式停止,而不用一次又一次按F5等到迴圈次數到達自己想要的。下面是一個例子,讓程式在第50次迴圈時停下來。從圖1中可以看到不僅可

執行緒池使用條件變數訊號量的效能比較

面試的時候經常被問到互斥量,條件變數和訊號量之間的問題。比如前幾天華為面試就被問到互斥量和訊號量的區別,說到互斥量也可以使用一個二值訊號量來實現,什麼情況是隻能使用互斥量而不能使用訊號量的。這個問題當時我只回答出一種情況,想了解詳情的可自行百度。如面試官所說,訊

Java條件語句if-else的嵌套原則

java;嵌套語句;if-else在Java中,條件語句的格式為:if(condition)Statement在此時的條件語句中的條件是需要用括號把它括起來。其實,Java中的條件語句和C/C++中的是一樣的。而Java常常希望在某個條件為真的時候執行多條語句。此時,我們就會引入一個概念,那就是“塊模塊(bl

實戰c++的vector系列--對vector&lt;自己定義類&gt;使用std::find std::find_if 算法

++ pac price key fadein 輸出 var getitem mod 之前博客講了一些關於std::find和std::find_ if的一些使用方法。可是沒有講述對於vector中存儲的是自己定義的類。那麽怎麽樣使用std::find和

Java Thread,run方法start方法的區別

bsp 區別 繼續 時間片 ron thread類 等待 nbsp art 兩種方法的區別: 1.start方法 用 start方法來啟動線程,是真正實現了多線程, 通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒

Java多線程系列 基礎篇03 Threadstart()run()的區別

light 接口調用 throw 後來 依然 != 進行 final 實現 1. start() 和 run()的區別 start():啟動一個新線程,新線程會執行相應的run()方法。start()不能被重復調用(會拋出異常)。 run() :run()就和普通的成員方

muduo庫的核心:std::bindstd::function

muduo main ons 源碼 綁定 func 靜態成員 con 函數 最近在讀完陳碩大牛的《Linux多線程服務端編程》以及muduo源碼後,對其中的一些實現細節有著十分深刻的印象,尤其是使用std::bind和std::function的回調技術。可以說,這兩個大殺

java成員變數區域性變數

1.成員變數   在類中定義,用來描述物件將要有什麼。 2.區域性變數 在類的方法中定義,在方法中臨時儲存資料 成員變數和區域性變數區別 1.作用域不同 成員變數的作用域在整個類內部都是可見的 區域性變數的作用僅限於定義它的方法、 2.初始值不同 jav