最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)多線程定時器實例講解

 更新時間:2021年01月03日 09:36:48   作者:chegxy  
在本篇文章里小編給各位分享的是一篇關(guān)于C語言實現(xiàn)多線程定時器實例講解內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。

1. 大致功能介紹

  • 實現(xiàn)任務(wù)列表,定時器會間隔一段時間遍歷列表發(fā)現(xiàn)要執(zhí)行的任務(wù)
  • 任務(wù)列表中的所有任務(wù)并行執(zhí)行
  • 每個任務(wù)都可以有自己的定時器,并且可以選擇是否要重復(fù)執(zhí)行
  • 定義方便的任務(wù)函數(shù)實現(xiàn)接口
  • 定時器可以由用戶自定義何時啟動和停止
  • 提供等待功能,保證任務(wù)列表中的所有任務(wù)執(zhí)行完成
  • 提供任務(wù)列表的傳參功能

2. API庫介紹

void setTick(int val);

設(shè)置定時間的間隔時間tick,若設(shè)置tick為1000,且任務(wù)的定時器時間為1000,則任務(wù)會在1秒后執(zhí)行,默認tick為1秒,最小tick時間為1us。

void addTimerTask(TimerTask task, int val, int autoreset, void *arg);

向任務(wù)列表注冊一個任務(wù),并指定其定時時間val,以及是否要重復(fù)執(zhí)行autoreset,并可以指定參數(shù)的地址。
task需要按照頭文件提供的宏來編寫,例如:

TASK_START(test2, arg)

	//body
 Arg *temp = (Arg*)arg;
 temp->ret = temp->a + temp->b;
 printf("This is a test2\n");

TASK_END

TASK_START(name, arg)是任務(wù)頭,name是任務(wù)名,arg是參數(shù)地址,TASK_END是任務(wù)結(jié)尾。任務(wù)體內(nèi)可編寫正常的c語言代碼,并使用參數(shù)arg指針。

autoreset有兩個可選項:AUTORESET(重復(fù)執(zhí)行),NORESET(執(zhí)行一次)。

若沒有參數(shù),可將arg參數(shù)設(shè)置為NULL。

void TimerWait();

用于等待任務(wù)列表中所有任務(wù)執(zhí)行完畢。

void TimerStop();

用于停止定時器。

void StartTimer();

用于啟動定時器。

3. 一個例子

#include <stdio.h>
#include "timer.h"

typedef struct Argument{
 int a;
 int b;
 int ret;
}Arg;

//任務(wù)1,打印語句
TASK_START(test1, arg)
 printf("This is a test1\n");
TASK_END

//任務(wù)2,計算arg中兩個數(shù)的和,打印語句
TASK_START(test2, arg)

 Arg *temp = (Arg*)arg;
 temp->ret = temp->a + temp->b;
 printf("This is a test2\n");

TASK_END

//任務(wù)3,打印語句
TASK_START(test3, arg)
 printf("This is a test3\n");
TASK_END

void main(){

 Arg arg;

	//設(shè)置tick 為 500ms
 setTick(500 * 1000);

	//添加任務(wù)1到任務(wù)列表,設(shè)置定時器時間為2.5s,重復(fù)執(zhí)行,無參數(shù)
 addTimerTask(test1, 5, AUTORESET, NULL);
 arg.a = 2; arg.b = 3;
 //添加任務(wù)2到任務(wù)列表,設(shè)置定時器時間為0.5s,不重復(fù)執(zhí)行,參數(shù)為arg
 addTimerTask(test2, 1, NORESET, &arg);
 //添加任務(wù)3到任務(wù)列表,設(shè)置定時器時間為1s,重復(fù)執(zhí)行,無參數(shù)
 addTimerTask(test3, 2, AUTORESET, NULL);

	//啟動定時器
 StartTimer();
 printf("Timer is started\n");
 //程序等待5秒
 sleep(5);
 //停止定時器
 TimerStop();
 //等待所有任務(wù)執(zhí)行完畢
 TimerWait();
 //打印任務(wù)二的計算結(jié)果
 printf("%d\n", arg.ret);

}

運行結(jié)果:

4. 庫文件源碼

timer.h:

#ifndef TIMER_H
#define TIMER_H
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <signal.h>
#define AUTORESET 1
#define NORESET 0
#define TASK_START(name, arg) void* name(void *arg){
#define TASK_END return NULL;} 
typedef void* (*TimerTask)(void* arg);
struct TaskItem{
 TimerTask task;
 int init_counter;
 int counter;
 pthread_t th;
 void *arg;
 void *ret;
 int flag;
 int autoreset;
 struct TaskItem *next;
 
};
void setTick(int val);
void* EventLoop(void* arg);
void addTimerTask(TimerTask task, int val, int autoreset, void *arg);
void TimerWait();
void TimerStop();
void StartTimer();
#endif //TIMER_H

timer.cpp

#include "timer.h"
#define STOPFLAG 0
#define RUNFLAG 1 
static int tick = 1000 * 1000;
static struct TaskItem head = {
 .next = NULL,
};
static pthread_t loop_thread;
static int flag = STOPFLAG;
static int tasknum = 0;

void setTick(int val){
 tick = val;
}
void* EventLoop(void* arg){
 
 struct TaskItem *task = head.next;
 struct TaskItem *pretask = &head;

 while(flag == RUNFLAG && tasknum > 0){
  
  while(task != NULL){
   if(task->counter == 0){ // it is time for doing task
    if(task->flag == STOPFLAG){ // task is not created
     if(0 != pthread_create(&(task->th), NULL, task->task, task->arg)){ // do a task
      printf("Failed to create user's task");
     }
     else{
      task->flag = RUNFLAG;
     }
    }
    else{
     if(0 != pthread_kill(task->th, 0)){ // current task is completed
      if(task->autoreset == AUTORESET){ // repeat execute
       task->counter = task->init_counter;
       task->flag = STOPFLAG;
      }
      else{ // delete a task
       pretask->next = task->next;
       free(task);
       task = pretask->next;
       tasknum--;
       continue;
      }
     }
    }
   }
   else{
    task->counter--;
   }
   pretask = pretask->next;
   task = task->next;
  }
  usleep(tick); // sleep a tick
  task = head.next;
  pretask = &head;
 }
 flag = STOPFLAG;
}
void addTimerTask(TimerTask task, int val, int autoreset, void *arg){
 struct TaskItem *node;
 node = (struct TaskItem*)malloc(sizeof(struct TaskItem));
 node->next = head.next;
 head.next = node;
 node->arg = arg;
 node->counter = val;
 node->init_counter = val;
 node->task = task;
 node->flag = STOPFLAG;
 node->autoreset = autoreset;
 tasknum++;
}
void TimerWait(){
 pthread_join(loop_thread, NULL);
}
void TimerStop(){
 flag = STOPFLAG;
}
void StartTimer(){
 flag = RUNFLAG;
 if(0 != pthread_create(&loop_thread, NULL, EventLoop, NULL)){
  printf("Failed to create loop task.\n");
 }
}

注意事項

  • 編譯要加 -l pthread選項
  • 庫實現(xiàn)在Linux環(huán)境,如果是windows需要修改線程創(chuàng)建函數(shù),休眠函數(shù)以及相應(yīng)的頭文件。

到此這篇關(guān)于C語言實現(xiàn)多線程定時器實例講解的文章就介紹到這了,更多相關(guān)C語言如何實現(xiàn)多線程定時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C++實現(xiàn)三種不同版本的通訊錄

    基于C++實現(xiàn)三種不同版本的通訊錄

    這篇文章主要為大家詳細介紹了如何通過C++實現(xiàn)三種不同版本的通訊錄(動態(tài)版本、靜態(tài)版本、文件版本),文中的示例代碼講解詳細,希望對大家有所幫助
    2022-11-11
  • c語言中static的用法詳細示例分析

    c語言中static的用法詳細示例分析

    以下是對c語言中static函數(shù)的用法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C++成員解除引用運算符的示例詳解

    C++成員解除引用運算符的示例詳解

    這篇文章主要介紹了C++成員解除引用運算符,本例子在編譯期間給指針賦值,在更為復(fù)雜的類中,可以使用指向數(shù)據(jù)成員和方法的成員指針,需要的朋友可以參考下
    2022-01-01
  • c++核心編程之函數(shù)的重載

    c++核心編程之函數(shù)的重載

    這篇文章主要介紹了c++核心編程之函數(shù)的重載,函數(shù)可以重復(fù)使用,提高了復(fù)用性,但前提是必須在一個作用域并且函數(shù)名稱相同,下面附代碼詳細介紹,需要的小伙伴可以參考一下
    2022-03-03
  • C++ Boost shared_ptr共享指針詳細講解

    C++ Boost shared_ptr共享指針詳細講解

    shared_ptr是一個標(biāo)準的共享所有權(quán)的智能指針,允許多個指針指向同一個對象,定義在memory文件中,命名空間為std,這篇文章主要介紹了C++ shared_ptr使用,需要的朋友可以參考下
    2022-11-11
  • C++中返回指向函數(shù)的指針示例

    C++中返回指向函數(shù)的指針示例

    int (*ff(int)) (int *,int);表示:ff(int)是一個函數(shù),帶有一個int型的形參,該函數(shù)返回int (*) (int *,int),它是一個指向函數(shù)的指針,所指向的函數(shù)返回int型并帶有兩個分別是Int*和int型的形參
    2013-09-09
  • C語言中的typedef、#define、const特點和用法介紹

    C語言中的typedef、#define、const特點和用法介紹

    在C 語言中,typedef、#define和const都用于定義常量和簡化代碼,但它們的用途和工作方式有顯著區(qū)別,下面詳細講解這三者的特點和用法,感興趣的朋友一起看看吧
    2024-08-08
  • C語言實現(xiàn)共享單車管理系統(tǒng)

    C語言實現(xiàn)共享單車管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)共享單車管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 一篇文章帶你了解C/C++的回調(diào)函數(shù)

    一篇文章帶你了解C/C++的回調(diào)函數(shù)

    這篇文章主要為大家介紹了C/C++的回調(diào)函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++函數(shù)重載詳解及實例代碼

    C++函數(shù)重載詳解及實例代碼

    這篇文章主要介紹了C++函數(shù)重載詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評論

涟水县| 渝北区| 丹凤县| 嘉峪关市| 阳朔县| 正安县| 饶河县| 桃源县| 定日县| 广德县| 临桂县| 岑溪市| 镇宁| 鞍山市| 全椒县| 沾化县| 镇远县| 乃东县| 北川| 赞皇县| 石楼县| 通辽市| 利津县| 张北县| 赣州市| 东莞市| 十堰市| 义马市| 固镇县| 新乡县| 信丰县| 英超| 循化| 勃利县| 尚志市| 台东市| 留坝县| 商南县| 湘潭县| 永昌县| 满城县|