Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::defer_lock,std::try_to_lock,std::adopt_lock,std::defer_lock_t,std::try_to_lock_t,std::adopt_lock_t

      From cppreference.com
      <cpp‎ |thread
       
       
      Concurrency support library
      Threads
      (C++11)
      (C++20)
      this_thread namespace
      (C++11)
      (C++11)
      (C++11)
      Cooperative cancellation
      Mutual exclusion
      Generic lock management
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      (C++11)
      defer_locktry_to_lockadopt_lockdefer_lock_ttry_to_lock_tadopt_lock_t
      (C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
      Condition variables
      (C++11)
      Semaphores
      Latches and Barriers
      (C++20)
      (C++20)
      Futures
      (C++11)
      (C++11)
      (C++11)
      Safe reclamation
      Hazard pointers
      Atomic types
      (C++11)
      (C++20)
      Initialization of atomic types
      (C++11)(deprecated in C++20)
      (C++11)(deprecated in C++20)
      Memory ordering
      (C++11)(deprecated in C++26)
      Free functions for atomic operations
      Free functions for atomic flags
       
      Defined in header<mutex>
      struct defer_lock_t{explicit defer_lock_t()=default;};
      (1)(since C++11)
      constexprstd::defer_lock_t defer_lock{};
      (2)(since C++11)
      (inline since C++17)
      struct try_to_lock_t{explicit try_to_lock_t()=default;};
      (3)(since C++11)
      constexprstd::try_to_lock_t try_to_lock{};
      (4)(since C++11)
      (inline since C++17)
      struct adopt_lock_t{explicit adopt_lock_t()=default;};
      (5)(since C++11)
      constexprstd::adopt_lock_t adopt_lock{};
      (6)(since C++11)
      (inline since C++17)
      1,3,5) The empty class tag typesstd::defer_lock_t,std::try_to_lock_t andstd::adopt_lock_t can be used in the constructor's parameter list forstd::unique_lock andstd::shared_lock to specify locking strategy.
      2,4,6) The correspondingstd::defer_lock,std::try_to_lock andstd::adopt_lock instances of(1,3,5) can be passed to the constructors to indicate the type of locking strategy.

      One of the constructors of the class templatestd::lock_guard only accepts the tagstd::adopt_lock.

      Type Effect(s)
      defer_lock_t do not acquire ownership of the mutex
      try_to_lock_t try to acquire ownership of the mutex without blocking
      adopt_lock_t assume the calling thread already has ownership of the mutex

      [edit]Example

      [edit]
      Run this code
      #include <iostream>#include <mutex>#include <thread> struct bank_account{explicit bank_account(int balance): balance{balance}{}int balance;std::mutex m;}; void transfer(bank_account& from, bank_account& to,int amount){if(&from==&to)// avoid deadlock in case of self transferreturn; // lock both mutexes without deadlockstd::lock(from.m, to.m);// make sure both already-locked mutexes are unlocked at the end of scopestd::lock_guard lock1{from.m, std::adopt_lock};std::lock_guard lock2{to.m, std::adopt_lock}; // equivalent approach://  std::unique_lock<std::mutex> lock1{from.m, std::defer_lock};//  std::unique_lock<std::mutex> lock2{to.m, std::defer_lock};//  std::lock(lock1, lock2);     from.balance-= amount;    to.balance+= amount;} int main(){    bank_account my_account{100};    bank_account your_account{50}; std::thread t1{transfer,std::ref(my_account),std::ref(your_account),10};std::thread t2{transfer,std::ref(your_account),std::ref(my_account),5};     t1.join();    t2.join(); std::cout<<"my_account.balance = "<< my_account.balance<<"\n""your_account.balance = "<< your_account.balance<<'\n';}

      Output:

      my_account.balance = 95your_account.balance = 55

      [edit]See also

      constructs alock_guard, optionally locking the given mutex
      (public member function ofstd::lock_guard<Mutex>)[edit]
      constructs aunique_lock, optionally locking (i.e., taking ownership of) the supplied mutex
      (public member function ofstd::unique_lock<Mutex>)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/lock_tag&oldid=177583"

      [8]ページ先頭

      ©2009-2025 Movatter.jp