1. 程式人生 > >libevent 多執行緒例子

libevent 多執行緒例子

主執行緒根據負載工作執行緒負載均衡演算法,每隔一秒鐘向特定的工作執行緒傳送一條字串資訊,工作執行緒簡單的把字串資訊打開出來。

Makefile

    eventtest : eventtest.c
    gcc -Wall -g -levent -lpthread -o eventtest eventtest.c
    .PHONY : clean
    clean :
    rm eventtest -f

code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>

    #include <sys/types.h>
    #include <sys/socket.h>

    #include <event.h>


    typedef struct {
        pthread_t tid;
        struct event_base *base;
        struct event event;
        int read_fd;
        int write_fd;
    }LIBEVENT_THREAD;

    typedef struct {
        pthread_t tid;
        struct event_base *base;
    }DISPATCHER_THREAD;


    const int thread_num = 10;

    LIBEVENT_THREAD *threads;
    DISPATCHER_THREAD dispatcher_thread;
    int last_thread = 0;



    static void
    thread_libevent_process(int fd, short which, void *arg)
    {
        int ret;
        char buf[128];
        LIBEVENT_THREAD *me = arg;

        if (fd != me->read_fd) {
            printf("thread_libevent_process error : fd != me->read_fd\n");
            exit(1);
        }

        ret = read(fd, buf, 128);
        if (ret > 0) {
            buf[ret] = '\0';
            printf("thread %llu receive message : %s\n", (unsigned long long)me->tid, buf);
        }


        return;
    }

    static void *
    worker_thread(void *arg)
    {
        LIBEVENT_THREAD *me = arg;
        me->tid = pthread_self();

        event_base_loop(me->base, 0);


        return NULL;
    }

    static void
    timeout_cb(int fd, short event, void *arg)
    {
        struct timeval tv;
        struct event *timeout = arg;

        int tid = (last_thread + 1) % thread_num;        //memcached中執行緒負載均衡演算法

        LIBEVENT_THREAD *thread = threads + tid;

        last_thread = tid;

        write(thread->write_fd, "Hello world!", sizeof("Hello world!") - 1);

        evutil_timerclear(&tv);
        tv.tv_sec = 1;
        event_add(timeout, &tv);
    }

    int
    main (int argc, char *argv[])
    {
        int ret;
        int i;
        int fd[2];
        struct event timeout;
        struct timeval tv;

        pthread_t tid;

        dispatcher_thread.base = event_init();
        if (dispatcher_thread.base == NULL) {
            perror("event_init( base )");
            return 1;
        }
        dispatcher_thread.tid = pthread_self();


        threads = calloc(thread_num, sizeof(LIBEVENT_THREAD));
        if (threads == NULL) {
            perror("calloc");
            return 1;
        }

        for (i = 0; i < thread_num; i++) {
            
            ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, fd);
            if (ret == -1) {
                perror("socketpair()");
                return 1;
            }

            threads[i].read_fd = fd[1];
            threads[i].write_fd = fd[0];

            threads[i].base = event_init();
            if (threads[i].base == NULL) {
                perror("event_init()");
                return 1;
            }


            event_set(&threads[i].event, threads[i].read_fd, EV_READ | EV_PERSIST, thread_libevent_process, &threads[i]);
            event_base_set(threads[i].base, &threads[i].event);
            if (event_add(&threads[i].event, 0) == -1) {
                perror("event_add()");
                return 1;
            }
        }

        for (i = 0; i < thread_num; i++) {
            pthread_create(&tid, NULL, worker_thread, &threads[i]);
        }

        evtimer_set(&timeout, timeout_cb, &timeout);
        event_base_set(dispatcher_thread.base, &timeout);
        evutil_timerclear(&tv);
        tv.tv_sec = 1;
        event_add(&timeout, &tv);

        event_base_loop(dispatcher_thread.base, 0);


        return 0;
    }


相關推薦

libevent 執行例子

主執行緒根據負載工作執行緒負載均衡演算法,每隔一秒鐘向特定的工作執行緒傳送一條字串資訊,工作執行緒簡單的把字串資訊打開出來。 Makefile eventtest : eventtest.c gcc -Wall -g -levent -lpthread -o

windows下Libevent +執行(負載均衡分配法) 之檔案傳輸

一、先說一下服務端的流程: 1、主執行緒負責監聽客戶端的連線; 2、當有客戶端連線時,主執行緒通過管道向相應的子執行緒傳送監聽套接字描述符,子執行緒通過負載均衡法選擇出來; 3、當主執行緒傳送監聽描述符時,子執行緒的讀管道回撥函式會被回撥; 4、子執行緒為收到的監聽描述符設定讀取

Java學習——執行例子:李四王五

  package cys; public class Example9_2 { public static void main(String[] args) { // TODO Auto-generated method stub P

windows下 Libevent +執行 實現檔案傳輸

1、模式:來一個客戶端連線進來,服務端就開啟一個處理執行緒。 2、缺點:對大量的客戶端情況不適用。大量客戶端的情況需要加入執行緒管理機制。 // LibeventTest.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #incl

Python3 執行例子

import threading, zipfile class AsyncZip(threading.Thread): def __init__(self, infile, outfile): threading.Thread.__init__(self) se

libevent執行伺服器

伺服器端程式碼: #include "lib_net.h" #include "lib_thread.h" #include "lib_public.h" #include<event.h>   #include<event2/util.h> #

multi-reactor伺服器模型的C++封裝類(libevent+執行實現)

最近在看memcached的原始碼,覺得它那種libevent+多執行緒的伺服器模型(multi-reactor)真的很不錯,我將這個模型封裝成一個C++類,根據我的簡單測試,這個模型的效率真的很不錯,歡迎大家試用。 這個類的使用方法很簡單(缺點是不太靈活),只

使用libevent執行驗證Linux上的伺服器"驚群"現象

什麼是驚群現象? 驚群(thundering herd)是指,只有一個子程序能獲得連線,但所有N個子程序卻都被喚醒了,這種情況將使效能受損。 舉一個很簡單的例子,當你往一群鴿子中間扔一塊食物,雖然最終只有一個鴿子搶到食物,但所有鴿子都會被驚動來爭奪,沒有搶到食物的鴿子只好回

執行例子:yield

Java程式碼   public class Test {       public static void main(String[] args) {           Thread t1 = new MyThread1();           Thread 

libevent執行

功能: 主執行緒同時監聽定時器事件和IO事件,工作執行緒簡單的監聽IO事件。 主執行緒每隔一秒種向工作執行緒傳送一條字串資訊 工作執行緒顯示該資訊並回顯給主執行緒 該示例演示了主執行緒如何同時監聽多個事件。 Makefile eventtest : eventtest.c gcc -Wall -

Python執行例子

Python多執行緒小例子 1、在主執行緒中建立子執行緒 下面的程式碼一共建立了三個執行緒:主執行緒、coding 執行緒和music 執行緒,最後使用thread_list 裝載執行緒

Python 執行工具包 threading 的超簡單例子

筆者初學 Python,在程式設計中,遇到了多執行緒的問題,即需要一個程式中的幾部分同時執行。 例如:給一個後臺程式寫一個“心跳程序”,定時輸出訊號,以確認程式正常執行。 在網上搜索了下發現有不少帖子,但總感覺帖子中舉的例子不夠簡單和直觀,遂決定寫個自己覺得夠簡單直觀的例子。程式碼如

[進階]-執行程序、非同步IO實用例子

在編寫爬蟲時,效能的消耗主要在IO請求中,當單程序單執行緒模式下請求URL時必然會引起等待,從而使得請求整體變慢。以下程式碼預設執行環境為python3。 目錄 一、多執行緒、多程序 1.同步執行 2.多執行緒執行 3.多執行緒+回撥函式執行 4.多程序執行 5.多程

Jsoup簡單例子2.0——執行爬取網頁內的郵箱

上一篇文章講了利用Jsoup爬取貼吧帖子裡的郵箱,雖然爬取成功了,但我對效率有所追求。10頁的帖子爬取了兩百多個郵箱,最快用時8秒,一般需要9秒。在思考了一下怎麼提升效率後,決定採用多執行緒的方式爬取網頁內的郵箱。廢話不多說,直接上程式碼。 引入Jsoup的jar包此處省略,沒有的可以檢視上篇文

windows下Libevent執行封裝(以檔案傳輸為例)

1、主執行緒負責監聽,子執行緒負責響應連線,同時每個子執行緒增加了連結串列來管理連線進來的客戶端,將上一節中的記憶體管理類也封裝進去。總體框架是不變的。 2、封裝類的實現: #pragma once #include "winsock2.h" #include "event2/liste

Java執行開發——一個簡單的數字加減小例子

範例: 兩個執行緒實現加法,兩個執行緒實現減法 class Resource { private int num = 0; private boolean flag = true; //flag = true 表示可以進行加法操作,不能進行減法操作 //flag = fa

libevent原始碼分析--鎖和執行

寫在前面: ​ 這個原始碼是分析libevent-2.0.20-stable, 並非最新版本的libevent,作者並沒有全看原始碼,在這裡會推薦以下參考的一些網站,也歡迎大家在不足的地方提出來進行討論。 鎖 ​ libevent的內部實現不需要多執行緒,

Java執行----執行的同步,鎖和死鎖,問題以及解決方法(例子說明)

一、執行緒併發同步概念 執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。 執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他

java 執行 同步 觀察者 併發集合的一個例子

//第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springframework.boot.SpringApplication; import org.springfram

以生活的例子說明單執行執行

以生活例子說明單執行緒與多執行緒 轉載自:書圈 1. 程式設計的目標 在我看來單從程式的角度來看,一個好的程式的目標應該是效能與使用者體驗的平衡。當然一個程式是否能夠滿足使用者的需求暫且不談,這是業務層面的問題,我們僅僅討論程式本身。圍繞兩點來展開,效能與