Partager via


lock::operator bool

Opérateur de l'utilisation d' lock dans une expression conditionnelle.

operator bool();

Valeur de retour

true si un verrou est maintenu, false sinon.

Notes

Cet opérateur convertit en réalité sur _detail_class::_safe_bool qui est plus sécurisé que bool car il ne peut pas être converti en un type intégral.

Exemple

Cet exemple utilise une seule instance d'une classe entre plusieurs threads.La classe utilise un verrou sur elle-même pour garantir que les accès à ses données internes sont homogènes pour chaque thread.Le thread d'application principal utilise un verrou sur la même instance de la classe pour vérifier périodiquement pour voir si des threads de travail sont toujours présentes, et attend pour quitter jusqu'à ce que tous les threads de travail ont terminé leurs tâches.

// msl_lock_op_bool.cpp
// compile with: /clr
#include <msclr/lock.h>

using namespace System;
using namespace System::Threading;
using namespace msclr;

ref class CounterClass {
private:
   int Counter;   

public:
   property int ThreadCount;

   // function called by multiple threads, use lock to keep Counter consistent
   // for each thread
   void UseCounter() {
      try {
         lock l(this); // wait infinitely

         Console::WriteLine("In thread {0}, Counter = {1}", Thread::CurrentThread->ManagedThreadId, 
            Counter);

         for (int i = 0; i < 10; i++) {
            Counter++;
            Thread::Sleep(10);
         }
         
         Console::WriteLine("In thread {0}, Counter = {1}", Thread::CurrentThread->ManagedThreadId, 
            Counter);

         Counter = 0;
         // lock is automatically released when it goes out of scope and its destructor is called
      }
      catch (...) {
         Console::WriteLine("Couldn't acquire lock!");
      }

      ThreadCount--;
   }
};

int main() {
   // create a few threads to contend for access to the shared data
   CounterClass^ cc = gcnew CounterClass;
   array<Thread^>^ tarr = gcnew array<Thread^>(5);
   ThreadStart^ startDelegate = gcnew ThreadStart(cc, &CounterClass::UseCounter);
   for (int i = 0; i < tarr->Length; i++) {
      tarr[i] = gcnew Thread(startDelegate);
      cc->ThreadCount++;
      tarr[i]->Start();
   }

   // keep our main thread alive until all worker threads have completed
   lock l(cc, lock_later); // don't lock now, just create the object
   while (true) {
      l.try_acquire(50); // try to acquire lock, don't throw an exception if can't
      if (l) { // use bool operator to check for lock
         if (0 == cc->ThreadCount) {
            Console::WriteLine("All threads completed.");
            break; // all threads are gone, exit while
         }
         else {
            Console::WriteLine("{0} threads exist, continue waiting...", cc->ThreadCount);
            l.release(); // some threads exist, let them do their work
         }
      }
   }
}
  

Configuration requise

fichier d'en-tête<msclr \ lock.h>

Msclr deEspace de noms

Voir aussi

Référence

lock::is_locked

Autres ressources

membres de verrouillage