基於ucontex實現使用者級執行緒

2021-04-18 18:19:43 字數 3633 閱讀 5196

ucontext

是linux

系統自帶的使用者級執行緒上下文,標頭檔案

ucontext.h

。我們可以用它來實現自定義的使用者級執行緒。

l基本型別

(1) ucontext_t

型別typedef struct ucontext//

使用者級執行緒上下文

ucontext_t;

(2) stack_t

typedef struct sigaltstack stack_t;

l使用者介面

介面

說明

int getcontext (ucontext_t *__ucp) __throw;

獲取使用者上下文,並儲存到使用者指定的

ucontext_t

型別變數

__ucp中。

void m

akecontext (ucontext_t *__ucp, void (*__func) (void),int __argc, ...) __throw;

將上下文

__ucp

與執行函式

__func

關聯起來。

int setcontext (__const ucontext_t *__ucp) __throw;

將上下文設定為指定

__ucp。

int swa

pcontext (ucontext_t *__restrict __oucp,__const ucontext_t *__restrict __ucp) __throw;

進行上下文切換,將當前上下文儲存到

__oucp

中,切換上下文到

__ucp。

l基於ucontext

的使用者級執行緒實現——

uthread 基於

ucontext

提供的型別與介面實現乙個簡單的非搶占式的使用者級執行緒

uthread

,具體包括在

uthread.h

和uthread.cpp

檔案中。

uthread.h

定義如下:

#ifndef _uthread_h

#define _uthread_h

#include

#include

#include

#define

stack_size

4096

#define

max_uthread_num

256

typedef int uthread_t;

typedef void uthread_attr_t;

struct uthread_struct;

static uthread_t uthread_current = -1;//

指示當前執行緒號,

-1表示主線程

static ucontext_t main_context;//

主線程的

context

static struct uthread_struct uthread_slots[max_uthread_num];//

執行緒slot

void uthread_context_init(int tid);

int uthread_create(uthread_t *thread, const uthread_attr_t *attr, void* (*start_routine)(void*), void *arg);

int uthread_next();

void uthread_exit(void *exit_status);

void uthread_run();

uthread_t uthread_self();

#endif //_uthread_h//

uthread.cpp

實現如下:

#include "uthread.h"

void uthread_context_init(int tid)

int uthread_create(uthread_t *thread, const uthread_attr_t *attr, void* (*start_routine)(void*), void *arg)

if (i==max_uthread_num)

return -1;

if (thread != null)

*thread = i;

uthread_context_init(i);

uthread_slots[i].used = 1;

uthread_slots[i].func = start_routine;

uthread_slots[i].arg = arg;

uthread_slots[i].exit_status = 0;

m

akecontext(&uthread_slots[i].context, uthread_run, 0);

return 0;

}

int uthread_next()

if(i==max_uthread_num) return -1;

else

}else

uthread_t uthread_prev = uthread_current;

if(i==uthread_current)else

}

return 0;

}void uthread_exit(void *exit_status)

void uthread_run()

uthread_t uthread_self()

uthread

目前提供以下一些型別和介面:

巨集定義

stack_size

執行緒棧大小

max_uthread_num

使用者級執行緒最大個數

型別

uthread_t

uthread

執行緒id

程式設計介面

int uthread_create(uthread_t *thread, const uthread_attr_t *attr, void* (*start_routine)(void*), void *arg);

建立執行緒,

thread

返回執行緒id,

attr

為執行緒引數,

start_routine

為執行緒函式,

arg為執行緒函式的引數。

返回值為

-1表示建立失敗,

0表示成功。

int uthread_next();

手工切換到下乙個執行緒執行,返回

-1表示使用者級執行緒已全部結束。

uthread_t uthread_self();

獲得當前執行中的執行緒的執行緒

id

Redis基於Bitmap實現使用者簽到功能

目錄 很多應用上都有使用者簽到的功能,尤其是配合積分系統一起使用。現在有以下需求 對於使用者簽到資料,如果直接採用資料庫儲存,當出現高併發訪問時,對資料庫壓力會很大,例如雙十一簽到活動。這時候應該採用快取,以減輕資料庫的壓力,redis是高效能的記憶體資料庫,適用於這樣的場景。如果採用string型...

Freeradius Mysql實現使用者認證

作者採用mysql 4.0與freeradius 0.9成功實現了認證與計費功能,下面是我遇到的一些問題,希望大家在遇到與我相同問題時少走一些彎路 configure make make install 之後執行radius x命令,若你看到類似authenting on port 1812,acc...

Django實現使用者登入

今天的文章基於之前做的配置,實現乙個具體的功能demo 登入。在login的templates目錄下建立兩個模板,分別是login.html和home.html,當使用者未登入時,跳轉到login.html頁面,登陸成功或者登入狀態,跳轉到home.html。url的配置主要有兩個,django d...