Contents

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
 */