1. 程式人生 > >Linux C 執行緒等待

Linux C 執行緒等待


sleep 時間單位是秒

usleep的時間單位是微秒

select的精度是微妙,精確

struct timeval delay;
delay.tv_sec 
=0;
delay.tv_usec 
=20*1000// 20 msselect(0, NULL, NULL, NULL, &delay);

usleep()有有很大的問題

  1. 在一些平臺下不是執行緒安全,如HP-UX以及Linux
  2. usleep()會影響訊號
  3. 在很多平臺,如HP-UX以及某些Linux下,當引數的值必須小於1 * 1000 * 1000也就是1秒,否則該函式會報錯,並且立即返回。
  4. 大部分平臺的幫助文件已經明確說了,該函式是已經被捨棄的函式。

還好,POSIX規範中有一個很好用的函式,nanosleep(),該函式沒有usleep()的這些缺點,它的精度是納秒級。在Solaris的多執行緒環境下編譯器會自動把usleep()連線成nanosleep()

Linux下短延時推薦使用select函式,因為準確.


******************************************************************************************

我只想要程序的某個執行緒休眠一段時間的,可是用sleep()是將整個程序都休眠的,這個可能就達不到,我們想要的效果了。 目前我知道有三種方式:

1 usleep

   這個是輕量級的, 聽說能可一實現執行緒休眠, 我個人並不喜歡這種方式,所以我沒有驗證它的可行信(個人不推薦)。

2 select

   這個可以,我也用過這種方式, 它是在輪詢。

3  pthread_cond_timedwait

        採用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timespec *abstime)可以優雅的解決該問題,設定等待條件變數cond,如果超時,則返回;如果等待到條件變數cond,也返回。本文暫不將內部機理,僅演示一個demo。

       首先,看這段程式碼,thr_fn為一個執行緒函式:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int flag = 1;  
  4. void * thr_fn(void * arg) {  
  5.   while (flag){  
  6.     printf("******\n");  
  7.     sleep(10);  
  8.   }  
  9.   printf("sleep test thread exit\n");  
  10. }  
  11. int main() {  
  12.   pthread_t thread;  
  13.   if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) {  
  14.     printf("error when create pthread,%d\n", errno);  
  15.     return 1;  
  16.   }  
  17.   char c ;  
  18.   while ((c = getchar()) != 'q');  
  19.   printf("Now terminate the thread!\n");  
  20.   flag = 0;  
  21.   printf("Wait for thread to exit\n");  
  22.   pthread_join(thread, NULL);  
  23.   printf("Bye\n");  
  24.   return 0;  
  25. }  
   輸入q後,需要等執行緒從sleep中醒來(由掛起狀態變為執行狀態),即最壞情況要等10s,執行緒才會被join。採用sleep的缺點:不能及時喚醒執行緒。
採用pthread_cond_timedwait函式實現的如下:
  1. #include <stdio.h>
  2. #include <sys/time.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <errno.h>
  6. static pthread_t thread;  
  7. static pthread_cond_t cond;  
  8. static pthread_mutex_t mutex;  
  9. staticint flag = 1;  
  10. void * thr_fn(void * arg)   
  11. {  
  12.   struct timeval now;  
  13.   struct timespec outtime;  
  14.   pthread_mutex_lock(&mutex);  
  15.   while (flag) {  
  16.     printf("*****\n");  
  17.     gettimeofday(&now, NULL);  
  18.     outtime.tv_sec = now.tv_sec + 5;  
  19.     outtime.tv_nsec = now.tv_usec * 1000;  
  20.     pthread_cond_timedwait(&cond, &mutex, &outtime);  
  21.   }  
  22.   pthread_mutex_unlock(&mutex);  
  23.   printf("cond thread exit\n");  
  24. }  
  25. int main(void)   
  26. {  
  27.   pthread_mutex_init(&mutex, NULL);  
  28.   pthread_cond_init(&cond, NULL);  
  29.   if (0 != pthread_create(&thread, NULL, thr_fn, NULL)) {  
  30.     printf("error when create pthread,%d\n", errno);  
  31.     return 1;  
  32.   }  
  33.   char c ;  
  34.   while ((c = getchar()) != 'q');  
  35.   printf("Now terminate the thread!\n");  
  36.   pthread_mutex_lock(&mutex);  
  37.   flag = 0;  
  38.   pthread_cond_signal(&cond);  
  39.   pthread_mutex_unlock(&mutex);  
  40.   printf("Wait for thread to exit\n");  
  41.   pthread_join(thread, NULL);  
  42.   printf("Bye\n");  
  43.   return 0;  
  44. }  

        pthread_cond_timedwait()函式阻塞住呼叫該函式的執行緒,等待由cond指定的條件被觸發(pthread_cond_broadcast() or pthread_cond_signal())。

        當pthread_cond_timedwait()被呼叫時,呼叫執行緒必須已經鎖住了mutex。函式pthread_cond_timedwait()會對mutex進行【解鎖和執行對條件的等待】(原子操作)。這裡的原子意味著:解鎖和執行條件的等待是原則的,一體的。(In this case, atomically means with respect to the mutex andthe condition variable and other access by threads to those objectsthrough the pthread condition variable interfaces.)

       如果等待條件滿足或超時,或執行緒被取消,呼叫執行緒需要線上程繼續執行前先自動鎖住mutex,如果沒有鎖住mutex,產生EPERM錯誤。即,該函式返回時,mutex已經被呼叫執行緒鎖住。

       等待的時間通過abstime引數(絕對系統時間,過了該時刻就超時)指定,超時則返回ETIMEDOUT錯誤碼。開始等待後,等待時間不受系統時鐘改變的影響。

       儘管時間通過秒和納秒指定,系統時間是毫秒粒度的。需要根據排程和優先順序原因,設定的時間長度應該比預想的時間要多或者少點。可以通過使用系統時鐘介面gettimeofday()獲得timeval結構體。


相關推薦

Linux C 執行等待

sleep 時間單位是秒 usleep的時間單位是微秒 select的精度是微妙,精確 struct timeval delay; delay.tv_sec =0; delay.tv_usec =20*1000; // 20 msselect(0, N

簡單Linux C執行

#include "threadpool.h"struct threadpool* threadpool_init(int thread_num, int queue_max_num){struct threadpool *pool = NULL;do { pool = malloc

Linux C++ 執行

標頭檔案定義: 話不多說,先上程式碼: 注意:本文程式碼來源於https://github.com/progschj/ThreadPool.git 不需要註釋,想要乾淨程式碼的可以直接上GitHub去找資源 標頭檔案 執行緒池類程式碼 /* * Date : 2018/7/24 * Aut

Linux C++ 執行同步鎖和wait()/broadcast()功能(二)

在第一篇中,我們講解了linux下鎖的概念: https://blog.csdn.net/zhangkai19890929/article/details/85107046 這一篇我們主要講解wait()和broadcast的 知識: 首先我們需要介紹的是: pthread_co

Linux C++ 執行同步鎖和wait()/broadcast()功能(一)

首先說下linux下的執行緒同步鎖的實現: 同步鎖脫離不開:pthread_mutex_t,mutex是互斥的意思,因此linux下的鎖是通過互斥訊號來實現的. pthread_mutex_t:代表一個互斥鎖,首先我們需要初始化這個互斥鎖. 第一步我們需要初始化互斥鎖: pt

linux c 執行傳多個引數

給新開啟的執行緒傳遞多個引數用結構體 struct Arges{     char topic[64];     char msg[64];     int len; }; int countThreat=0; void *text3(

linux c++執行池的實現(多執行伺服器)

        本文給出了一個通用的執行緒池框架,該框架將與執行緒執行相關的任務進行了高層次的抽象,使之與具體的執行任務無關。另外該執行緒池具有動態伸縮性,它能根據執行 任務的輕重自動調整執行緒池中執行緒的數量。文章的最後,我們給出一個簡單示例程式,通過該示例程式,我們會發

Linux c 執行屬性,執行優先順序的修改

執行緒屬性的設定,網上找的文章總感覺不夠全面,還是結合man手冊檢視。 執行緒屬性設定,分兩個方式,一種是在建立之前,通過pthread_attr_t 結構體傳入,另一種,是執行緒建立完已經在執行時,通過部分函式設定。一般常見的是建立執行緒時傳NULL,使用預設屬性,後續執

linux c 執行間同步(通訊)的幾種方法--互斥鎖,條件變數,訊號量,讀寫鎖

轉載自:https://blog.csdn.net/vertor11/article/details/55657619Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。 下面是思維導圖: 一、互斥鎖(mutex)   鎖機制是同一時刻只允

linux下的C語言開發(執行等待)

和多程序一樣,多執行緒也有自己的等待函式。這個等待函式就是pthread_join函式。那麼這個函式有什麼用呢?我們其實可以用它來等待執行緒執行結束。 #include <stdio.h> #include <pthread.h> #include

C#:執行(4):執行等待

執行緒等待,或者說叫等待執行緒。其語句是  執行緒名.Join()   。按照我的理解,這個語句其實是告訴系統程式,這個執行緒很重要,你必須使用全部的計算資源供他計算,等他計算結束了之後再回到這個位置。     舉例來說,下面這個程式就用了執行緒等

c/c++ 多執行 等待一次性事件 packaged_task用法

多執行緒 等待一次性事件 packaged_task用法 背景:不是很明白,不知道為了解決什麼業務場景,感覺std::asynck可以優雅的搞定一切,一次等待性事件,為什麼還有個packaged_task。 用法:和std::async一樣,也能夠返回std::future,通過呼叫get_future方

c/c++ 多執行 等待一次性事件 std::promise用法

多執行緒 等待一次性事件 std::promise用法 背景:不是很明白,不知道為了解決什麼業務場景,感覺std::async可以優雅的搞定一切的一次等待性事件,為什麼還有個std::promise。 用法:和std::async一樣,也能夠返回std::future,通過呼叫get_future方法。也

c/c++ 多執行 多個執行等待同一個執行的一次性事件

多執行緒 多個執行緒等待一個執行緒的一次性事件 背景:從多個執行緒訪問同一個std::future,也就是多個執行緒都在等待同一個執行緒的結果,這時怎麼處理。 辦法:由於std::future只能被呼叫一次get方法,也就是隻能被某一個執行緒等待(同步)一次,不支援被多個執行緒等待。所以std::shar

使用C++編寫linux執行程式

前言 在這個多核時代,如何充分利用每個 CPU 核心是一個繞不開的話題,從需要為成千上萬的使用者同時提供服務的服務端應用程式,到需要同時開啟十幾個頁面,每個頁面都有幾十上百個連結的 web 瀏覽器應用程式,從保持著幾 t 甚或幾 p 的資料的資料庫系統,到手機上的一個有良好使用者響應能力的 app,為了充分

linux執行程式設計(C):訊號量實現的執行安全佇列

用訊號量實現的執行緒安全佇列。 簡單有用的示例程式, 比起互斥量的實現在多執行緒時效率更好。 cir_queue.h /* * \File * cir_queue.h * \Brief * circular queue */#ifndef __CIR_QUEUE_H_

Linux執行學習(5)--C++實現一個執行

多執行緒學習總結(1):https://blog.csdn.net/hansionz/article/details/84665815 多執行緒學習總結(2):https://blog.csdn.net/hansionz/article/details/84675536 多執行緒學習總結

Linux執行總結:初識、建立、等待、終止、分離

學習環境 :  Centos6.5 Linux 核心 2.6 Linux執行緒部分總結分為兩部分:(1)執行緒的使用 ,(2)執行緒的同步與互斥。 第一部分執行緒的使用主要介紹,執行緒的概念,建立執行緒,執行緒退出,以及執行緒的終止與分離。

[C++11 std::thread] 使用C++11 編寫 Linux執行程式

前言 在這個多核時代,如何充分利用每個 CPU 核心是一個繞不開的話題,從需要為成千上萬的使用者同時提供服務的服務端應用程式,到需要同時開啟十幾個頁面,每個頁面都有幾十上百個連結的 web 瀏覽器應用程式,從保持著幾 t 甚或幾 p 的資料的資料庫系統,到手機上的一個有良好使用者響應能力的 app,為了

【嵌入式Linux C程式設計】Linux執行程式設計

程序——資源分配的最小單位,執行緒——程式執行的最小單位。執行緒是程序的一個執行流,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。一個程序由幾個執行緒組成(擁有很多相對獨立的執行流的使用者程式共享應用程式的大部分資料結構),執行緒與同屬一個程序的其他的執