#ifndef EE_H
#define EE_H
#include "../config.h"
#include <unistd.h>
#include <pthread.h>
#include "../sysdeps.h"
//此头文件提供线程库对ort的支持
//线程库只会提供两只类型:othr_lock_t和othr_key_t,嵌套锁类型不会在线程库外使用
//嵌套锁类型结构体,只在线程库内部使用
typedef struct {
pthread_mutex_t lock;//互斥量
pthread_mutex_t ilock;//访问互斥量,访问此结构体前需获得此锁
pthread_cond_t cond;//条件变量,用于通知其他task可以对此嵌套锁上锁
int count;//同一个task对此嵌套锁的上锁次数
void *owner;//此嵌套锁的属主,是一个指向ort_task_node_t结构体的指针
} othr_nestlock_t;
//线程库锁类型
typedef union {
struct {
int type;//锁类型:可以取三种不同的值,通用锁/嵌套锁/自旋锁
union {
pthread_mutex_t normal;//通用锁
othr_nestlock_t nest;//嵌套锁
struct {//自旋锁
int rndelay;//存储初始时延,在setlock中使用
pthread_mutex_t mutex;
} spin;
} data;//锁数据
} lock;//锁
char padding[CACHE_LINE];//用于防止伪共享
} othr_lock_t;
//初始化全局内部控制变量和线程库性能参数,初始化ICVs副本,设置线程栈大小,创建默认数目的线程池节点并让其自旋
extern int othr_initialize(int *argc, char ***argv, ort_icvs_t *icv, ort_caps_t *cap);
//此函数没有做任何事情
extern void othr_finalize(int exitvalue);
//申请numthr个线程,level为子线程的level,返回的数目可能小于申请的数目
extern int othr_request(int numthreads, int level);
//取下numthreads个线程池节点,解开自旋,arg指向eecb,info为eecb的info
extern void othr_create(int numthreads, int level, void *arg, void **info);
//等待所有子线程结束,将结束了的线程送回线程池,info为eecb的info
extern void othr_waitall(void **info);
//将当前线程放到就绪队列末
#define othr_yield() sched_yield()
//#define USE_TLS
//线程库键类型定义
#define othr_key_t pthread_key_t
//创建线程库键,参数a为键,b为键的销毁函数(一般为空)
#define othr_key_create(a,b) pthread_key_create(a,b)
//获取指定的键
#define othr_getspecific(a) pthread_getspecific(a)
//设置键的值
#define othr_setspecific(a,b) pthread_setspecific(a,b)
//初始化给定的锁为给定的type类型
extern int othr_init_lock(othr_lock_t *lock, int type);
//销毁给定的锁
extern int othr_destroy_lock(othr_lock_t *lock);
//对给定的锁上锁
extern int othr_set_lock(othr_lock_t *lock);
//对给定的锁解锁
extern int othr_unset_lock(othr_lock_t *lock);
//尝试对给定的锁上锁,返回1时表示尝试上锁成功,否则表示失败
extern int othr_test_lock(othr_lock_t *lock);
#endif // EE_H
ee.h
最新推荐文章于 2020-11-27 14:17:15 发布