Qyoto  4.0.7
Qyoto is a C# language binding for Qt
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Properties
QtCore.QSemaphore Class Reference

The QSemaphore class provides a general counting semaphore. More...

Inheritance diagram for QtCore.QSemaphore:
Collaboration diagram for QtCore.QSemaphore:

Public Member Functions

 QSemaphore (int n=0)
  More...
 
virtual void CreateProxy ()
 
new void Acquire (int n=1)
  More...
 
new void Release (int n=1)
  More...
 
new bool TryAcquire (int n=1)
  More...
 
new bool TryAcquire (int n, int timeout)
  More...
 
new void Dispose ()
 

Protected Member Functions

 QSemaphore (System.Type dummy)
 

Protected Attributes

SmokeInvocation interceptor
 

Properties

int Available [get]
  More...
 
virtual System.IntPtr SmokeObject [get, set]
 

Detailed Description

The QSemaphore class provides a general counting semaphore.

A semaphore is a generalization of a mutex. While a mutex can only be locked once, it's possible to acquire a semaphore multiple times. Semaphores are typically used to protect a certain number of identical resources.

Semaphores support two fundamental operations, acquire() and release():

acquire(n) tries to acquire n resources. If there aren't that many resources available, the call will block until this is the case.

release(n) releases n resources.

There's also a tryAcquire() function that returns immediately if it cannot acquire the resources, and an available() function that returns the number of available resources at any time.

Example:

QSemaphore sem(5); // sem.available() == 5

sem.acquire(3); // sem.available() == 2

sem.acquire(2); // sem.available() == 0

sem.release(5); // sem.available() == 5

sem.release(5); // sem.available() == 10

sem.tryAcquire(1); // sem.available() == 9, returns true

sem.tryAcquire(250); // sem.available() == 9, returns false

A typical application of semaphores is for controlling access to a circular buffer shared by a producer thread and a consumer thread. The Semaphores example shows how to use QSemaphore to solve that problem.

A non-computing example of a semaphore would be dining at a restaurant. A semaphore is initialized with the number of chairs in the restaurant. As people arrive, they want a seat. As seats are filled, available() is decremented. As people leave, the available() is incremented, allowing more people to enter. If a party of 10 people want to be seated, but there are only 9 seats, those 10 people will wait, but a party of 4 people would be seated (taking the available seats to 5, making the party of 10 people wait longer).

See also QMutex, QWaitCondition, QThread, and Semaphores Example.

Constructor & Destructor Documentation

QtCore.QSemaphore.QSemaphore ( System.Type  dummy)
protected
QtCore.QSemaphore.QSemaphore ( int  n = 0)

Creates a new semaphore and initializes the number of resources it guards to n (by default, 0).

See also release() and available().

Here is the call graph for this function:

Member Function Documentation

new void QtCore.QSemaphore.Acquire ( int  n = 1)

Tries to acquire n resources guarded by the semaphore. If n > available(), this call will block until enough resources are available.

See also release(), available(), and tryAcquire().

virtual void QtCore.QSemaphore.CreateProxy ( )
virtual

Here is the caller graph for this function:

new void QtCore.QSemaphore.Dispose ( )
new void QtCore.QSemaphore.Release ( int  n = 1)

Releases n resources guarded by the semaphore.

This function can be used to "create" resources as well. For example:

QSemaphore sem(5); // a semaphore that guards 5 resources

sem.acquire(5); // acquire all 5 resources

sem.release(5); // release the 5 resources

sem.release(10); // "create" 10 new resources

See also acquire() and available().

new bool QtCore.QSemaphore.TryAcquire ( int  n = 1)

Tries to acquire n resources guarded by the semaphore and returns true on success. If available() < n, this call immediately returns false without acquiring any resources.

Example:

QSemaphore sem(5); // sem.available() == 5

sem.tryAcquire(250); // sem.available() == 5, returns false

sem.tryAcquire(3); // sem.available() == 2, returns true

See also acquire().

new bool QtCore.QSemaphore.TryAcquire ( int  n,
int  timeout 
)

Tries to acquire n resources guarded by the semaphore and returns true on success. If available() < n, this call will wait for at most timeout milliseconds for resources to become available.

Note: Passing a negative number as the timeout is equivalent to calling acquire(), i.e. this function will wait forever for resources to become available if timeout is negative.

Example:

QSemaphore sem(5); // sem.available() == 5

sem.tryAcquire(250, 1000); // sem.available() == 5, waits 1000 milliseconds and returns false

sem.tryAcquire(3, 30000); // sem.available() == 2, returns true without waiting

See also acquire().

Member Data Documentation

SmokeInvocation QtCore.QSemaphore.interceptor
protected

Property Documentation

int QtCore.QSemaphore.Available
get

Returns the number of resources currently available to the semaphore. This number can never be negative.

See also acquire() and release().

virtual System.IntPtr QtCore.QSemaphore.SmokeObject
getset