Linux平台上C語言實現非同步佇列的兩種方法

2021-07-02 02:10:06 字數 2148 閱讀 5660

linux上目前有兩種事件通知方式,一種是執行緒條件變數,一種是利用eventfd實現事件通知,下面介紹一下利用這兩種方法實現非同步佇列的方法。

相關函式介紹

喚醒丟失問題

如果執行緒未持有與條件相關聯的互斥鎖,則呼叫 pthread_cond_signal() 或 pthread_cond_broadcast() 會產生喚醒丟失錯誤。滿足以下所有條件時,即會出現喚醒丟失問題:

訊號不起作用,因此將會丟失,僅當修改所測試的條件但未持有與之相關聯的互斥鎖時,才會出現此問題。只要僅在持有關聯的互斥鎖同時修改所測試的條件,即可呼叫 pthread_cond_signal() 和 pthread_cond_broadcast(),而無論這些函式是否持有關聯的互斥鎖。

執行緒條件變數使用方法

get_resources(int amount)    

resources -= amount;

pthread_mutex_unlock(&rsrc_lock);

add_resources(int amount)

int eventfd(unsigned int initval, int flags);

eventfd是linux提供核心態的事件等待/通知機制,核心維護了乙個8位元組的整型數,該整型數由initval來初始化,flags引數可以由以下值位或而來:

當核心維護的8位元組整型數為0時,read操作會阻塞,如果為fd設定為非阻塞模式,則返回eagain錯誤。

下面我們實現乙個簡單的環形佇列:

#define default_size 1024

typedef struct queue

queue_t;

queue_t *queue_create(int size)

else

q->header = q->tail = q->size = 0;

}return q;

}int queue_is_full(queue_t *q)

int queue_is_empty(queue_t *q)

void queue_push_tail(queue_t *q, void *data)

}void *queue_pop_head(queue_t *q)

return data;

}int *queue_free(queue_t *q)

typedef struct async_queue

async_queue_t;

async_queue_t *async_queue_create(int size)

void async_queue_push_tail(async_queue_t *q, void *data)

pthread_mutex_unlock(&(q->mutex));

}}void *async_queue_pop_head(async_queue_t *q, struct timeval *tv)

q->waiting_threads--;

}retval = queue_pop_head(q->_queue);

pthread_mutex_unlock(&(q->mutex));

return retval;

}void async_queue_free(async_queue_t *q)

typedef struct async_queue

async_queue_t;

async_queue_t *async_queue_create(int size)

void async_queue_push_tail(async_queue_t *q, void *data)

}void *async_queue_pop_head(async_queue_t *q, struct timeval *tv)

else

}void async_queue_free(async_queue_t *q)

兩種實現方法執行緒條件變數比較複雜,但是效能略高,而eventfd實現簡單,但是效能略低。

Linux平台上用C 實現多執行緒互斥鎖

在上篇用c 實現了win32平台上的多執行緒互斥鎖,這次寫個linux平台上的,同樣參考了開源專案c sockets的 在此對這些給開源專案做出貢獻的鬥士們表示感謝!下邊分別是互斥鎖類和測試 已經在fedora 13虛擬機器上測試通過。lock.h ifndef lock h define lock...

Linux平台上用C 實現多執行緒互斥鎖

在上篇用c 實現了win32平台上的多執行緒互斥鎖,這次寫個linux平台上的,同樣參考了開源專案c sockets的 在此對這些給開源專案做出貢獻的鬥士們表示感謝!下邊分別是互斥鎖類和測試 已經在fedora 13虛擬機器上測試通過。lock.h cpp view plain copy ifnde...

在Symbian OS平台上移植C語言工程的方法

symbian是應用於高階手機 智慧型手機 上的一種作業系統,諾基亞 索愛的高階手機便是基於symbian作業系統的,symbian os的優勢在於其高穩定性和節能性,並且有眾多主流手機產商的支援,現在是高階手機上的主流作業系統之一。在synbian os上的應用開發主要是以c 語言為主,但是也支援...