@@ -1215,9 +1215,11 @@ self.addEventListener('message', (event) => {
12151215
12161216上面代码将共享内存的偶数位置的值改成` 1 ` ,奇数位置的值改成` 2 ` 。
12171217
1218- ** (3)Atomics.wait(),Atomics.wake ()** 
1218+ ** (3)Atomics.wait(),Atomics.notify ()** 
12191219
1220- 使用` while ` 循环等待主线程的通知,不是很高效,如果用在主线程,就会造成卡顿,` Atomics ` 对象提供了` wait() ` 和` wake() ` 两个方法用于等待通知。这两个方法相当于锁内存,即在一个线程进行操作时,让其他线程休眠(建立锁),等到操作结束,再唤醒那些休眠的线程(解除锁)。
1220+ 使用` while ` 循环等待主线程的通知,不是很高效,如果用在主线程,就会造成卡顿,` Atomics ` 对象提供了` wait() ` 和` notify() ` 两个方法用于等待通知。这两个方法相当于锁内存,即在一个线程进行操作时,让其他线程休眠(建立锁),等到操作结束,再唤醒那些休眠的线程(解除锁)。
1221+ 
1222+ ` Atomics.notify() ` 方法以前叫做` Atomics.wake() ` ,后来进行了改名。
12211223
12221224``` javascript 
12231225//  Worker 线程
@@ -1240,10 +1242,10 @@ const newArrayValue = 100;
12401242Atomics .store (sharedArray, 0 , newArrayValue);
12411243const  arrayIndex  =  0 ;
12421244const  queuePos  =  1 ;
1243- Atomics .wake (sharedArray, arrayIndex, queuePos);
1245+ Atomics .notify (sharedArray, arrayIndex, queuePos);
12441246``` 
12451247
1246- 上面代码中,` sharedArray ` 的` 0 ` 号位置改为` 100 ` ,然后就执行` Atomics.wake () ` 方法,唤醒在` sharedArray ` 的` 0 ` 号位置休眠队列里的一个线程。
1248+ 上面代码中,` sharedArray ` 的` 0 ` 号位置改为` 100 ` ,然后就执行` Atomics.notify () ` 方法,唤醒在` sharedArray ` 的` 0 ` 号位置休眠队列里的一个线程。
12471249
12481250` Atomics.wait() ` 方法的使用格式如下。
12491251
@@ -1256,14 +1258,14 @@ Atomics.wait(sharedArray, index, value, timeout)
12561258-  sharedArray:共享内存的视图数组。
12571259-  index:视图数据的位置(从0开始)。
12581260-  value:该位置的预期值。一旦实际值等于预期值,就进入休眠。
1259- -  timeout:整数,表示过了这个时间以后,就自动唤醒,单位毫秒。该参数可选,默认值是` Infinity ` ,即无限期的休眠,只有通过` Atomics.wake () ` 方法才能唤醒。
1261+ -  timeout:整数,表示过了这个时间以后,就自动唤醒,单位毫秒。该参数可选,默认值是` Infinity ` ,即无限期的休眠,只有通过` Atomics.notify () ` 方法才能唤醒。
12601262
1261- ` Atomics.wait() ` 的返回值是一个字符串,共有三种可能的值。如果` sharedArray[index] ` 不等于` value ` ,就返回字符串` not-equal ` ,否则就进入休眠。如果` Atomics.wake () ` 方法唤醒,就返回字符串` ok ` ;如果因为超时唤醒,就返回字符串` timed-out ` 。
1263+ ` Atomics.wait() ` 的返回值是一个字符串,共有三种可能的值。如果` sharedArray[index] ` 不等于` value ` ,就返回字符串` not-equal ` ,否则就进入休眠。如果` Atomics.notify () ` 方法唤醒,就返回字符串` ok ` ;如果因为超时唤醒,就返回字符串` timed-out ` 。
12621264
1263- ` Atomics.wake () ` 方法的使用格式如下。
1265+ ` Atomics.notify () ` 方法的使用格式如下。
12641266
12651267``` javascript 
1266- Atomics .wake (sharedArray, index, count)
1268+ Atomics .notify (sharedArray, index, count)
12671269``` 
12681270
12691271它的三个参数含义如下。
@@ -1272,24 +1274,24 @@ Atomics.wake(sharedArray, index, count)
12721274-  index:视图数据的位置(从0开始)。
12731275-  count:需要唤醒的 Worker 线程的数量,默认为` Infinity ` 。
12741276
1275- ` Atomics.wake () ` 方法一旦唤醒休眠的 Worker 线程,就会让它继续往下运行。
1277+ ` Atomics.notify () ` 方法一旦唤醒休眠的 Worker 线程,就会让它继续往下运行。
12761278
12771279请看一个例子。
12781280
12791281``` javascript 
12801282//  主线程
12811283console .log (ia[37 ]);  //  163
12821284Atomics .store (ia, 37 , 123456 );
1283- Atomics .wake (ia, 37 , 1 );
1285+ Atomics .notify (ia, 37 , 1 );
12841286
12851287//  Worker 线程
12861288Atomics .wait (ia, 37 , 163 );
12871289console .log (ia[37 ]);  //  123456
12881290``` 
12891291
1290- 上面代码中,视图数组` ia ` 的第 37 号位置,原来的值是` 163 ` 。Worker 线程使用` Atomics.wait() ` 方法,指定只要` ia[37] ` 等于` 163 ` ,就进入休眠状态。主线程使用` Atomics.store() ` 方法,将` 123456 ` 写入` ia[37] ` ,然后使用` Atomics.wake () ` 方法唤醒 Worker 线程。
1292+ 上面代码中,视图数组` ia ` 的第 37 号位置,原来的值是` 163 ` 。Worker 线程使用` Atomics.wait() ` 方法,指定只要` ia[37] ` 等于` 163 ` ,就进入休眠状态。主线程使用` Atomics.store() ` 方法,将` 123456 ` 写入` ia[37] ` ,然后使用` Atomics.notify () ` 方法唤醒 Worker 线程。
12911293
1292- 另外,基于` wait ` 和` wake ` 这两个方法的锁内存实现,可以看 Lars T Hansen 的 [ js-lock-and-condition] ( https://github.com/lars-t-hansen/js-lock-and-condition )  这个库。
1294+ 另外,基于` wait ` 和` notify ` 这两个方法的锁内存实现,可以看 Lars T Hansen 的 [ js-lock-and-condition] ( https://github.com/lars-t-hansen/js-lock-and-condition )  这个库。
12931295
12941296注意,浏览器的主线程不宜设置休眠,这会导致用户失去响应。而且,主线程实际上会拒绝进入休眠。
12951297
@@ -1335,3 +1337,4 @@ Atomics.xor(sharedArray, index, value)
13351337-  ` Atomics.isLockFree(size) ` :返回一个布尔值,表示` Atomics ` 对象是否可以处理某个` size ` 的内存锁定。如果返回` false ` ,应用程序就需要自己来实现锁定。
13361338
13371339` Atomics.compareExchange ` 的一个用途是,从 SharedArrayBuffer 读取一个值,然后对该值进行某个操作,操作结束以后,检查一下 SharedArrayBuffer 里面原来那个值是否发生变化(即被其他线程改写过)。如果没有改写过,就将它写回原来的位置,否则读取新的值,再重头进行一次操作。
1340+ 
0 commit comments