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...