왜 데드락(deadlock)이 발생하는지와 어떻게 해결할지를 알아봅시다~
이렇게 if b == nil을 통해서 처음 blockchain을 불러온다면 저 함수들이 쓰여지도록 만들었는데요
저걸 없애보니 deadlock이 발생합니다
Do 함수에 대한 설명 중 일부입니다
해석해보면 Do함수는 f가 리턴할 때까지 리턴하지 않기 때문에, f(Do 안의 함수)가 Do함수를 부른다면 데드락에 걸릴거라고 합니다
if b == nil을 지운 상태에서 함수를 보자면
이 상황을 글로 적어보자면
1. block들을 보기 위해 blocks 페이지를 눌렀다
2. blocks 함수가 실행되면서 Blockchain() 함수가 실행된다
3. Blockchain() 함수 속 AddBlock() 함수가 실행된다
4. AddBlock() 함수 속 createBlock() 함수가 실행된다
5. createBlock() 함수 속 Blockchain() 함수가 또 실행된다
6. 결국 Do함수 속 f 함수가 Do를 실행시킨다 -> 무한루프에 빠진다
그러면 결국 Do함수의 설명대로 Do함수 안에있는 f(함수)가 Do함수를 부르게 되어서 deadlock에 걸리게 됩니다
무한 반복되기 때문이죠
그러면 어떻게 해결할까요?
createBlock() 함수에서 Blockchain()을 부르지 않게끔 코드를 바꿔주면 되겠죠?
이렇게 Blockchain() 함수를 사용하지 않게 인자로 diff 난이도를 받고
AddBlock() 에서 리시버로 받은 Blockchain 주소를 getdifficulty(난이도 구하는 함수)의 매개변수로 넘겨주어 Blockchain() 을 호출하지 않고 방금 전과 같은 기능을 하도록 만들었습니다
'go언어 블록체인' 카테고리의 다른 글
노마드 코인 11-3 (0) | 2021.08.01 |
---|---|
노마드 코인 11-2 (0) | 2021.07.30 |
노마드 코인 11-1 (0) | 2021.07.30 |
노마드 코더 10-12 리뷰 (0) | 2021.07.30 |
노마드코인 10-11 리뷰 (0) | 2021.07.29 |