ARST打卡第149周[149/521]

Algorithm

lc393_UTF-8编码验证

思路: 直接模拟

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Solution {
public:
int how_many_bytes(int code) {
// 0xxx
if ((code & (1 << 7)) == 0) {
return 1;
}
// 10xxx
if ((code & (1 << 6)) == 0) {
return -1;
}
// 110xxx
if ((code & (1 << 5)) == 0) {
return 2;
}
// 1110xxx
if ((code & (1 << 4)) == 0) {
return 3;
}
// 1111 0xxx
if ((code & (1 << 3)) == 0) {
return 4;
}
return -1;
}

bool is_remain_code(int code) {
// 0xxx
if ((code & (1 << 7)) == 0) {
return 0;
}
// 10xxx
if ((code & (1 << 6)) == 0) {
return 1;
}
return 0;
}

bool validUtf8(vector<int>& data) {
int sz = data.size();
assert(sz);

int tmp_code_cnt = -1;
for (int i = 0; i < sz; i++) {
assert(data[i] >= 0 && data[i] <= 255);
tmp_code_cnt = how_many_bytes(data[i]);
if (tmp_code_cnt == -1) {
return false;
}

// 减去本身的那个字节
tmp_code_cnt--;
while (tmp_code_cnt--) {
i++;
if (i == sz || !is_remain_code(data[i])) {
return false;
}
}
}

return true;
}
};

Review

【TED演讲】区块链将如何从根本上改变经济

演讲主要是讲了区块链通过分布式记录方式,保证过程可信,从而使得区块链代替可信交易,然后成为经济去中心化的一部分。但是演讲中举例购买物品,就让我想到闲鱼,交易如果发生了不达预期的情况,买家不满意的话,在目前我的了解来看,这是必然需要一个第三方介入的,否则真的没法区分是店家作弊还是买家作弊,除非发货和收货都需要做一遍极其严格的测试…但是这应该不太可能…

Tips

自旋锁和读写锁
https://www.cs.utexas.edu/~pingali/CS378/2015sp/lectures/Spinlocks%20and%20Read-Write%20Locks.htm

这篇文章介绍了一些普通锁的多种实现方式及性能对比 和 读写锁的多种实现方式及性能对比

Share-读写锁的读锁是否会超过最大数量

当我的程序出错在读锁的时候,我怀疑获取读锁的线程数超过了读锁的最大数量了,嗯嗯,因为以前可以跑,加大线程数就跑不动了,所以应该就是超过数量了,可以测试读线程验证一下

网上找了一下,发现并不是如此,因为最大数量很大…

所以还是仔细看日志,发现是先获取了写锁,然后再获取读锁,导致了死锁,所以报错在读锁上

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <pthread.h>
#include <stdio.h>
#include <limits.h>

int
main(int argc, char **argv)
{
unsigned long long i;
pthread_rwlock_t rw;
int r;

pthread_rwlock_init(&rw, NULL);


for (i = 0; i < INT_MAX; i++) {
if ((r = pthread_rwlock_rdlock(&rw)) != 0)
break;
if (i % 10000000 == 0)
printf("%llu\n", i);
}

printf("%d %llu\n", r, i);

return 0;
}


// gcc test.c -o test.out -lpthread

/*
0
10000000
20000000
30000000
40000000
50000000
60000000
70000000
80000000
90000000
100000000
110000000
120000000
130000000
140000000
150000000
160000000
170000000
180000000
190000000
200000000
210000000
220000000
230000000
240000000
250000000
260000000
11 268435455
*/