Flutter synchronized lock

다중 루틴과 관련이 있을 때는 반드시 자물쇠, 데이터 동기화를 고려해야 한다.
자료 찾기:synchronized:https://pub.dev/packages/synchronized#-readme-tab-
 
가장 기본적인 애플리케이션:
하나의 변수 a가 있습니다. 여러 개의 루트가 접근할 때, 같은 시간에 한 개의 루트만 읽거나 설정해야 합니다. (C#의 lock () {} 와 같습니다.우리가synchronized를 사용하여 처리할 수 있다면 매우 쉽다.예:
_lock.synchronized(()async{
    //dealing with var a
    //...
});

 
여기에 주의해야 할 점이 하나 있는데, 이 동기화 프로그램 블록 (프로그램 함수) 은 비동기적이다. 예를 들어
선생은 기본 프로젝트를 만들고 함수를 추가합니다. 함수의 내용은 다음과 같습니다.
    debugPrint("${DateTime.now().toString()}$_bCounting");

    _lock.synchronized( ()async{//block 1
      _bCounting = !_bCounting;
      debugPrint("1:in lock. changed to: $_bCounting");

      _lock.synchronized( ()async{//block 2
        _bCounting = !_bCounting;
        debugPrint("2:in lock. changed to: $_bCounting");
      });
    });

변수 2개 추가
  bool _bCounting = false;
  var _lock = Lock();

 
단추를 추가하고 위의 함수를 호출하려면 누르십시오. 결과는 다음과 같습니다. (단추를 두 번 눌렀습니다)
2019-12-05 15:15:38.958 false
1:in lock. changed to: true
2:in lock. changed to: false

2019-12-05 15:15:45.535 false
1:in lock. changed to: true
2:in lock. changed to: false

록이 작동하지 않은 것 같습니다.두 번 호출되었는데 모두 프로그램 블록에 들어갔다.
실제 문제는 두 개의 프로그램 블록이 완성을 기다리지 않았기 때문에 실제 상황은 Block1이 먼저 완성되고 자물쇠를 풀고 순조롭게 Block2에 들어가는 것이다.
 
프로그램을 바꾸면 다음과 같습니다: Block2에 await가 추가되었습니다
    debugPrint("${DateTime.now().toString()}$_bCounting");

    _lock.synchronized( ()async{
      _bCounting = !_bCounting;
      debugPrint("1:in lock. changed to: $_bCounting");

      await _lock.synchronized( ()async{ //added keyword "await"
        _bCounting = !_bCounting;
        debugPrint("2:in lock. changed to: $_bCounting");
      });
    });

실행 결과는 다음과 같습니다: (버튼을 두 번 눌렀습니다)
2019-12-05 15:23:22.241 false
1:in lock. changed to: true

2019-12-05 15:23:24.196 true

현재 실행할 때마다 Block2가 끝날 때까지 기다려야 하고, Block2가 필요로 하는 자원은 Block1이 먼저 끝날 때까지 기다려야 하며, 서로 기다리는 것은 사라진 자물쇠가 된다.
 
--END--

좋은 웹페이지 즐겨찾기