rockbed 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +143 -0
  2. package/dist/assert/index.d.ts +6 -0
  3. package/dist/assert/index.js +27 -0
  4. package/dist/assert/index.js.map +1 -0
  5. package/dist/async/index.d.ts +105 -0
  6. package/dist/async/index.js +380 -0
  7. package/dist/async/index.js.map +1 -0
  8. package/dist/dispose/index.d.ts +47 -0
  9. package/dist/dispose/index.js +166 -0
  10. package/dist/dispose/index.js.map +1 -0
  11. package/dist/dispose-base-CAeXDpjg.d.ts +6 -0
  12. package/dist/error/index.d.ts +46 -0
  13. package/dist/error/index.js +150 -0
  14. package/dist/error/index.js.map +1 -0
  15. package/dist/error-base-BWuBlS2k.d.ts +28 -0
  16. package/dist/event/index.d.ts +57 -0
  17. package/dist/event/index.js +167 -0
  18. package/dist/event/index.js.map +1 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.js +989 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/json/index.d.ts +4 -0
  23. package/dist/json/index.js +20 -0
  24. package/dist/json/index.js.map +1 -0
  25. package/dist/lock/index.d.ts +106 -0
  26. package/dist/lock/index.js +404 -0
  27. package/dist/lock/index.js.map +1 -0
  28. package/dist/response/index.d.ts +17 -0
  29. package/dist/response/index.js +19 -0
  30. package/dist/response/index.js.map +1 -0
  31. package/package.json +80 -0
  32. package/src/assert/assert.ts +24 -0
  33. package/src/assert/index.ts +2 -0
  34. package/src/async/barrier.ts +47 -0
  35. package/src/async/index.ts +8 -0
  36. package/src/async/promise.ts +316 -0
  37. package/src/async/wait.ts +7 -0
  38. package/src/dispose/disposable-store.ts +68 -0
  39. package/src/dispose/disposable-t.ts +85 -0
  40. package/src/dispose/disposable-utils.ts +13 -0
  41. package/src/dispose/dispose-base.ts +9 -0
  42. package/src/dispose/index.ts +8 -0
  43. package/src/dispose/logger.ts +41 -0
  44. package/src/error/error-base.ts +39 -0
  45. package/src/error/error-code.ts +48 -0
  46. package/src/error/error-const.ts +16 -0
  47. package/src/error/error-or.ts +2 -0
  48. package/src/error/error-t.ts +93 -0
  49. package/src/error/index.ts +5 -0
  50. package/src/event/emitter.ts +193 -0
  51. package/src/event/index.ts +10 -0
  52. package/src/index.ts +8 -0
  53. package/src/json/index.ts +1 -0
  54. package/src/json/json.ts +15 -0
  55. package/src/lock/README.md +11 -0
  56. package/src/lock/capability.ts +89 -0
  57. package/src/lock/index.ts +2 -0
  58. package/src/lock/semaphore.ts +21 -0
  59. package/src/lock/shared-mutex.ts +256 -0
  60. package/src/response/index.ts +1 -0
  61. package/src/response/response.ts +27 -0
  62. package/tsconfig.json +23 -0
@@ -0,0 +1,85 @@
1
+ import { DisposableStore } from './disposable-store';
2
+ import type { IDisposable } from './dispose-base';
3
+ import { BRANCH_DISPOSE } from './logger';
4
+
5
+ //
6
+ // Disposable基类
7
+ //
8
+ // 自动添加DisposableStore,提供默认的dispose和register方法
9
+ //
10
+ export abstract class Disposable implements IDisposable {
11
+ protected readonly _store = new DisposableStore();
12
+
13
+ // 销毁该节点和所有的子节点
14
+ dispose(): void {
15
+ BRANCH_DISPOSE(this.constructor.name, this._store.constructor.name);
16
+
17
+ this._store.dispose();
18
+ }
19
+
20
+ // 挂载子节点
21
+ protected _register<T extends IDisposable>(o: T): T {
22
+ if ((o as unknown as Disposable) === this) {
23
+ throw new Error('Cannot register a disposable on itself!');
24
+ }
25
+ return this._store.add(o);
26
+ }
27
+ }
28
+
29
+ export class MutableDisposable<T extends IDisposable> implements IDisposable {
30
+ private _value?: T;
31
+ private _isDisposed = false;
32
+
33
+ constructor(value?: T) {
34
+ this.value = value;
35
+ }
36
+
37
+ get value(): T | undefined {
38
+ return this._isDisposed ? undefined : this._value;
39
+ }
40
+
41
+ set value(value: T | undefined) {
42
+ if (this._isDisposed || value === this._value) {
43
+ return;
44
+ }
45
+
46
+ this._value?.dispose();
47
+ this._value = value;
48
+ }
49
+
50
+ clear(): void {
51
+ this.value = undefined;
52
+ }
53
+
54
+ dispose(): void {
55
+ this._isDisposed = true;
56
+ this._value?.dispose();
57
+ this._value = undefined;
58
+ }
59
+
60
+ release(): T | undefined {
61
+ const oldValue = this._value;
62
+ this._value = undefined;
63
+ return oldValue;
64
+ }
65
+ }
66
+
67
+ export class SafeDisposable<T extends IDisposable> implements IDisposable {
68
+ private _value: T | null = null;
69
+
70
+ constructor(value: T) {
71
+ this._value = value;
72
+ }
73
+
74
+ isEmpty() {
75
+ return this._value === null;
76
+ }
77
+
78
+ dispose() {
79
+ if (!this._value) {
80
+ return;
81
+ }
82
+ this._value.dispose();
83
+ this._value = null;
84
+ }
85
+ }
@@ -0,0 +1,13 @@
1
+ import { SafeDisposable } from './disposable-t';
2
+ import { EmptyDispose } from './dispose-base';
3
+
4
+ export function makeSafeDisposable(fn: (...args: any) => any) {
5
+ const disposable = new SafeDisposable({
6
+ dispose: fn,
7
+ });
8
+ return disposable;
9
+ }
10
+
11
+ export function makeEmptyDisposable() {
12
+ return EmptyDispose;
13
+ }
@@ -0,0 +1,9 @@
1
+ //
2
+ // Disposable特征约束
3
+ //
4
+ export interface IDisposable {
5
+ dispose: () => void;
6
+ }
7
+
8
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
9
+ export const EmptyDispose = Object.freeze<IDisposable>({ dispose() {} });
@@ -0,0 +1,8 @@
1
+ export type { IDisposable } from './dispose-base';
2
+ export { EmptyDispose } from './dispose-base';
3
+ export { DisposableStore } from './disposable-store';
4
+ export { Disposable, MutableDisposable, SafeDisposable } from './disposable-t';
5
+ export { makeSafeDisposable } from './disposable-utils';
6
+ export { makeEmptyDisposable } from './disposable-utils';
7
+ export { disposeWithLog } from './logger';
8
+ export type { IDisposableLogger } from './logger';
@@ -0,0 +1,41 @@
1
+ import type { IDisposable } from './dispose-base';
2
+
3
+ let disposableLogger: IDisposableLogger | null = null;
4
+
5
+ export interface IDisposableLogger {
6
+ branch: (from: string, to: string) => void;
7
+ end: () => void;
8
+ }
9
+
10
+ function setDisposableLogger(logger: IDisposableLogger | null): void {
11
+ disposableLogger = logger;
12
+ }
13
+
14
+ function makeDefaultLogger() {
15
+ return new (class implements IDisposableLogger {
16
+ private readonly _dep: [string, string][] = [];
17
+
18
+ branch(from: string, to: string): void {
19
+ this._dep.push([from, to]);
20
+ }
21
+
22
+ end(): void {
23
+ // console.log(this._dep);
24
+ }
25
+ })();
26
+ }
27
+
28
+ // 辅助能力 dispose触发时记录
29
+ export function BRANCH_DISPOSE(from: string, to: string) {
30
+ disposableLogger?.branch(from, to);
31
+ }
32
+
33
+ export function disposeWithLog<T extends IDisposable>(
34
+ x: T,
35
+ logger: IDisposableLogger = makeDefaultLogger(),
36
+ ) {
37
+ setDisposableLogger(logger);
38
+ x.dispose();
39
+ logger.end();
40
+ setDisposableLogger(null);
41
+ }
@@ -0,0 +1,39 @@
1
+ //
2
+ // lv项目中使用的错误类型
3
+ //
4
+
5
+ export const ILvErrorRef = Symbol.for('rockbed.ILvErrorRef');
6
+ export type ILvErrorRef = ILvErrorOr<never>;
7
+
8
+ export const ILvRealErrorRef = Symbol.for('rockbed.ILvRealErrorRef');
9
+ export interface ILvRealErrorRef {
10
+ readonly ok: false;
11
+ readonly code: number;
12
+ readonly msg: string;
13
+ readonly cause?: ILvErrorRef | Error;
14
+ readonly toString: () => string;
15
+ readonly pair: () => [ILvRealErrorRef, null];
16
+ readonly errorInfo?: unknown;
17
+ }
18
+
19
+ //
20
+ // 没有错误时,可以直接使用 value 字段
21
+ //
22
+ export const ILvValueRef = Symbol.for('rockbed.ILvValueRef');
23
+ export interface ILvValueRef<T> {
24
+ readonly ok: true;
25
+ readonly code: 0;
26
+ readonly msg: '';
27
+ readonly cause?: undefined;
28
+ readonly value: T;
29
+ readonly toString: () => string;
30
+ readonly pair: () => [null, T];
31
+ }
32
+
33
+ //
34
+ // lv项目中使用的携带值可能错误类型
35
+ //
36
+ export const ILvErrorOr = Symbol.for('rockbed.ILvErrorOr');
37
+ export type ILvErrorOr<T> = (ILvRealErrorRef | ILvValueRef<T>) & {
38
+ readonly pair: () => [null, T] | [ILvRealErrorRef, null];
39
+ };
@@ -0,0 +1,48 @@
1
+ import { lvErrorConst } from './error-const';
2
+
3
+ /**
4
+ * 提供了通用的错误码(+1至+256)
5
+ *
6
+ * 注意:这里只是提供了通用的错误码,方便服务使用,但并不是要求服务一定使用如下的错误码来表明某种错误
7
+ */
8
+ export enum GenericError {
9
+ Ok = 0,
10
+ Cancelled = 1, // 操作被取消
11
+ TimedOut = 2, // 操作超时
12
+ PermissionDenied = 3, // 无权限
13
+ AlreadyExists = 4, // 已经存在(文件/记录等)
14
+ NotSupported = 5, // 操作不支持
15
+ ResourceUnavailable = 6, // 资源不可用
16
+ OutOfRange = 7, // (参数/结果等)发生越界
17
+ InvalidArgument = 8, // 无效参数
18
+ NetworkFailed = 9, // 网络失败
19
+ Interrupted = 10, // 操作被中断(捕获异常转为错误)
20
+ ResultNil = 11, // 结果不存在(null or undefined转为错误)
21
+ }
22
+
23
+ /**
24
+ * 通用错误码所对应的编译时常量对象(ErrorConst)
25
+ */
26
+ export const cancelledError = lvErrorConst(GenericError.Cancelled, 'operation(s) cancelled.');
27
+ export const timeoutError = lvErrorConst(GenericError.TimedOut, 'operation(s) timed out.');
28
+ export const permissionDeniedError = lvErrorConst(
29
+ GenericError.PermissionDenied,
30
+ 'permission denied.',
31
+ );
32
+ export const alreadyExistsError = lvErrorConst(GenericError.AlreadyExists, 'already exists.');
33
+ export const notSupportedError = lvErrorConst(
34
+ GenericError.NotSupported,
35
+ 'operation(s) not supported.',
36
+ );
37
+ export const resourceUnavailableError = lvErrorConst(
38
+ GenericError.ResourceUnavailable,
39
+ 'resource is unavailable.',
40
+ );
41
+ export const outOfRangeError = lvErrorConst(GenericError.OutOfRange, 'out of range.');
42
+ export const invalidArgumentError = lvErrorConst(
43
+ GenericError.InvalidArgument,
44
+ 'invalid arguments.',
45
+ );
46
+ export const networkFailedError = lvErrorConst(GenericError.NetworkFailed, 'network failed.');
47
+ export const interruptedError = lvErrorConst(GenericError.Interrupted, 'interrupted.');
48
+ export const resultNilError = lvErrorConst(GenericError.ResultNil, 'result is nil.');
@@ -0,0 +1,16 @@
1
+ import { makeError, makeErrorBy } from './error-t';
2
+
3
+ //
4
+ // Error编译时错误对象
5
+ //
6
+ export function lvErrorConst(code: number, msg: string) {
7
+ return (rewrite?: string | Error) => {
8
+ if (!rewrite) {
9
+ return makeError(code, msg);
10
+ }
11
+ if (typeof rewrite === 'string') {
12
+ return makeError(code, rewrite);
13
+ }
14
+ return makeErrorBy(code, rewrite.message, rewrite);
15
+ };
16
+ }
@@ -0,0 +1,2 @@
1
+ // makeOkWith 依赖内部 lvErrorRefSymbol,先放到 error-t 里面实现,有需要再拆分
2
+ export { makeOkWith } from './error-t';
@@ -0,0 +1,93 @@
1
+ import type { ILvErrorRef, ILvErrorOr, ILvRealErrorRef } from './error-base';
2
+
3
+ //
4
+ // Error类
5
+ //
6
+ // 用户给函数签名明确错误
7
+ // function foo(): ILvErrorRef
8
+ // return makeOk(); // 如果没有错误
9
+ // return makeError(code, msg); // 指定错误码和携带消息
10
+ //
11
+ // const SomeError = LvErrorConst(code, msg); // 更推荐用LvErrorConst生成
12
+ // return SomeError();
13
+ //
14
+
15
+ const lvErrorRefSymbol = Symbol('lvErrorRef');
16
+
17
+ export function makeOk(): ILvErrorOr<never> {
18
+ return {
19
+ ok: true,
20
+ value: null!,
21
+ pair() {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
23
+ return [null, null!] as any;
24
+ },
25
+ code: 0,
26
+ msg: '',
27
+ ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测
28
+ };
29
+ }
30
+
31
+ export function makeOkWith<T>(value: T): ILvErrorOr<T> {
32
+ return {
33
+ ok: true,
34
+ value,
35
+ pair() {
36
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
37
+ return [null, value] as any;
38
+ },
39
+ code: 0,
40
+ msg: '',
41
+ ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测
42
+ };
43
+ }
44
+
45
+ function printCause(cause: ILvErrorRef | Error | undefined): string {
46
+ if (cause === undefined) {
47
+ return '';
48
+ } else if (cause instanceof Error) {
49
+ return `\ncaused by [jsError]${cause.name}-${cause.message}`;
50
+ } else {
51
+ return `\ncaused by [${cause.code}]${cause.msg}${cause.ok ? '' : printCause(cause.cause)}`;
52
+ }
53
+ }
54
+
55
+ function internalMakeError(
56
+ code: number,
57
+ msg: string,
58
+ cause?: ILvErrorRef | Error,
59
+ errorInfo?: unknown,
60
+ ) {
61
+ const errorRef: ILvRealErrorRef = {
62
+ ok: false,
63
+ code,
64
+ msg,
65
+ cause,
66
+ errorInfo,
67
+ toString() {
68
+ return `[${code}]${msg}.${cause ? printCause(cause) : ''}`;
69
+ },
70
+ pair() {
71
+ return [errorRef, null];
72
+ },
73
+ ...{ [lvErrorRefSymbol]: true }, // 跳过类型检测
74
+ };
75
+ return errorRef;
76
+ }
77
+
78
+ export function makeError(code: number, msg: string, errorInfo?: unknown): ILvRealErrorRef {
79
+ return internalMakeError(code, msg, undefined, errorInfo);
80
+ }
81
+
82
+ export function makeErrorBy(
83
+ code: number,
84
+ msg: string,
85
+ cause: ILvErrorRef | Error,
86
+ errorInfo?: unknown,
87
+ ): ILvRealErrorRef {
88
+ return internalMakeError(code, msg, cause, errorInfo);
89
+ }
90
+
91
+ export function isLvErrorRef(val: unknown): val is ILvErrorRef {
92
+ return typeof val === 'object' && val !== null && lvErrorRefSymbol in val;
93
+ }
@@ -0,0 +1,5 @@
1
+ export * from './error-base';
2
+ export * from './error-const';
3
+ export * from './error-or';
4
+ export * from './error-t';
5
+ export * from './error-code';
@@ -0,0 +1,193 @@
1
+ /* eslint-disable @typescript-eslint/no-redundant-type-constituents */
2
+ import { makeSafeDisposable } from '../dispose';
3
+ import type { IDisposable } from '../dispose';
4
+
5
+ export interface EmitterOptions {
6
+ onAddListener?: (...args: any) => any;
7
+ onRemoveListener?: (...args: any) => any;
8
+ onListenerError?: (e: any) => void;
9
+ }
10
+
11
+ /**
12
+ * 默认错误处理:异步抛出监听器错误,避免阻塞当前事件分发。
13
+ */
14
+ export function asyncUnexpectedErrorHandler(e: unknown): undefined {
15
+ setTimeout(() => {
16
+ throw e;
17
+ }, 0);
18
+ }
19
+
20
+ /**
21
+ * 同步抛出监听器错误,适合测试或需要立即失败的场景。
22
+ */
23
+ export function syncUnexpectedError(e: unknown): undefined {
24
+ throw e;
25
+ }
26
+
27
+ /**
28
+ * 忽略监听器错误,适合明确允许 best-effort 通知的场景。
29
+ */
30
+ export function ignoreUnexpectedError(_e: unknown): undefined {}
31
+
32
+ //
33
+ // 事件监听中的回调实体
34
+ //
35
+ class Listener<TArgs extends any[]> {
36
+ private readonly _callback: (...args: TArgs) => void;
37
+ private readonly _callbackThis: any | undefined;
38
+
39
+ constructor(callback: (...args: TArgs) => void, callbackThis: any | undefined) {
40
+ this._callback = callback;
41
+ this._callbackThis = callbackThis;
42
+ }
43
+
44
+ invoke(...args: TArgs): void {
45
+ this._callback.call(this._callbackThis, ...args);
46
+ }
47
+ }
48
+
49
+ //
50
+ // 存放在EventDeliveryQueue中的元素
51
+ //
52
+ class EventDeliveryQueueElement<TArgs extends any[]> {
53
+ readonly emitter: Emitter<TArgs>;
54
+ readonly listener: Listener<TArgs>;
55
+ readonly event: TArgs;
56
+ constructor(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs) {
57
+ this.emitter = emitter;
58
+ this.listener = listener;
59
+ this.event = event;
60
+ }
61
+ }
62
+
63
+ export class EventDeliveryQueue {
64
+ protected _queue: EventDeliveryQueueElement<any>[] = [];
65
+
66
+ constructor(
67
+ private readonly _onListenerError: (e: unknown) => void = asyncUnexpectedErrorHandler,
68
+ ) {}
69
+
70
+ get size(): number {
71
+ return this._queue.length;
72
+ }
73
+
74
+ push<TArgs extends any[]>(
75
+ emitter: Emitter<TArgs>,
76
+ listener: Listener<TArgs>,
77
+ event: TArgs,
78
+ ): void {
79
+ this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));
80
+ }
81
+
82
+ clear<TArgs extends any[]>(emitter: Emitter<TArgs>): void {
83
+ this._queue = this._queue.filter((element) => element.emitter !== emitter);
84
+ }
85
+
86
+ deliver(): void {
87
+ while (this._queue.length > 0) {
88
+ const element = this._queue.shift()!;
89
+ try {
90
+ element.listener.invoke(...element.event);
91
+ } catch (e) {
92
+ this._onListenerError(e);
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ export interface Event<T extends any[]> {
99
+ (listener: (...args: T) => any, thisArgs?: any): IDisposable;
100
+ }
101
+
102
+ export class Emitter<TArgs extends any[]> {
103
+ protected _listeners?: Set<Listener<TArgs>>;
104
+ private readonly _options?: EmitterOptions;
105
+ private _disposed = false;
106
+ private _event?: Event<TArgs>;
107
+ private _deliveryQueue?: EventDeliveryQueue;
108
+
109
+ constructor(options?: EmitterOptions) {
110
+ this._options = options;
111
+ }
112
+
113
+ get event(): Event<TArgs> {
114
+ if (this._event) {
115
+ return this._event;
116
+ }
117
+
118
+ this._event = (callback: (...args: TArgs) => any, thisArgs?: any): IDisposable => {
119
+ if (!this._listeners) {
120
+ this._listeners = new Set();
121
+ }
122
+
123
+ const listener = new Listener(callback, thisArgs);
124
+ this._listeners.add(listener);
125
+
126
+ if (this._options?.onAddListener) {
127
+ this._options.onAddListener(this, callback, thisArgs);
128
+ }
129
+
130
+ // 生成可销毁函数返回
131
+ const result = () => {
132
+ if (!this._disposed) {
133
+ this._listeners?.delete(listener);
134
+ if (this._options?.onRemoveListener) {
135
+ this._options.onRemoveListener(this, callback, thisArgs);
136
+ }
137
+ }
138
+ };
139
+
140
+ return makeSafeDisposable(result);
141
+ };
142
+
143
+ return this._event;
144
+ }
145
+
146
+ dispose(): void {
147
+ if (this._disposed) {
148
+ return;
149
+ }
150
+ this._disposed = true;
151
+ this._listeners?.clear();
152
+ this._deliveryQueue?.clear(this);
153
+ }
154
+
155
+ fire(...event: TArgs): void {
156
+ if (!this._listeners) {
157
+ return;
158
+ }
159
+ this._deliveryQueue ??= new EventDeliveryQueue(this._options?.onListenerError);
160
+
161
+ for (const listener of this._listeners) {
162
+ this._deliveryQueue.push(this, listener, event);
163
+ }
164
+ this._deliveryQueue.deliver();
165
+ }
166
+ }
167
+
168
+ // 辅助能力:只监听某个事件一次
169
+ export function listenOnce<TArgs extends any[]>(event: Event<TArgs>): Event<TArgs> {
170
+ return (listener, thisArgs = null) => {
171
+ let didFire = false;
172
+ let result: IDisposable | undefined = undefined;
173
+
174
+ result = event((...args) => {
175
+ if (didFire) {
176
+ return;
177
+ }
178
+ if (result) {
179
+ result.dispose();
180
+ } else {
181
+ didFire = true;
182
+ }
183
+
184
+ return listener.call(thisArgs, ...args);
185
+ }, null);
186
+
187
+ if (didFire) {
188
+ result.dispose();
189
+ }
190
+
191
+ return result;
192
+ };
193
+ }
@@ -0,0 +1,10 @@
1
+ // 事件相关能力
2
+ export {
3
+ Emitter,
4
+ EventDeliveryQueue,
5
+ asyncUnexpectedErrorHandler,
6
+ ignoreUnexpectedError,
7
+ listenOnce,
8
+ syncUnexpectedError,
9
+ } from './emitter';
10
+ export type { EmitterOptions, Event } from './emitter';
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ export * from './assert';
2
+ export * from './async';
3
+ export * from './dispose';
4
+ export * from './error';
5
+ export * from './event';
6
+ export * from './json';
7
+ export * from './lock';
8
+ export * from './response';
@@ -0,0 +1 @@
1
+ export * from './json';
@@ -0,0 +1,15 @@
1
+ export function safeJsonParse<T>(value: string): T {
2
+ try {
3
+ return JSON.parse(value);
4
+ } catch (error) {
5
+ return {} as T;
6
+ }
7
+ }
8
+
9
+ export function safeJsonStringify<T>(value: T): string {
10
+ try {
11
+ return JSON.stringify(value);
12
+ } catch (error) {
13
+ return '{}';
14
+ }
15
+ }
@@ -0,0 +1,11 @@
1
+ # 读写锁
2
+ TODO(niurouwan): 补上
3
+
4
+ ## 核心
5
+ - 写写互斥、读写互斥,读读可重入
6
+ - 写者优先于读者
7
+ - 写者唤醒顺序按调用顺序来
8
+
9
+ ## 实现原理
10
+
11
+ ## 使用举例