# 原子性
<?php
declare(strict_types=1);
use function Swoole\Coroutine\run;
run(function () {
$atomic = new \Swoole\Atomic();
$str = "";
go(function () use (&$str, $atomic) {
$str .= "a";
$atomic->add();
});
go(function () use (&$str, $atomic) {
while ($atomic->get() != 1) {
}
$str .= "b";
$atomic->add();
});
go(function () use (&$str, $atomic) {
while ($atomic->get() != 2) {
}
$str .= "c";
});
var_dump($str);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 标记
<?php
declare(strict_types=1);
use function Swoole\Coroutine\run;
run(function () {
$firstJobDone = false;
$secondJobDone = false;
$str = "";
go(function () use (&$firstJobDone, &$str) {
$str .= "a";
$firstJobDone = true;
});
go(function () use (&$firstJobDone, &$secondJobDone, &$str) {
while (!$firstJobDone) {
}
$str .= "b";
$secondJobDone = true;
});
go(function () use (&$secondJobDone, &$str) {
while (!$secondJobDone) {
}
$str .= "c";
});
var_dump($str);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 锁
<?php
declare(strict_types=1);
use function Swoole\Coroutine\run;
run(function () {
$firstJobDoneLock = new Swoole\Lock();
$secondJobDoneLock = new Swoole\Lock();
$str = "";
$firstJobDoneLock->lock();
$secondJobDoneLock->lock();
go(function () use ($firstJobDoneLock, &$str) {
$str .= "a";
$firstJobDoneLock->unlock();
});
go(function () use ($firstJobDoneLock, $secondJobDoneLock, &$str) {
$firstJobDoneLock->lock();
$str .= "b";
$secondJobDoneLock->unlock();
});
go(function () use ($secondJobDoneLock, &$str) {
$secondJobDoneLock->lock();
$str .= "c";
});
// abc
var_dump($str);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36