rwlock(3c) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

rwlock(3c)

Standard C Library Functions                                        rwlock(3C)



NAME
       rwlock,  rwlock_init,  rwlock_destroy,  rw_rdlock, rw_wrlock, rw_tryrd‐
       lock, rw_trywrlock, rw_unlock - multiple readers, single writer locks

SYNOPSIS
       #include <synch.h>

       int rwlock_init(rwlock_t *rwlp, int type, void * arg);


       int rwlock_destroy(rwlock_t *rwlp);


       int rw_rdlock(rwlock_t *rwlp);


       int rw_wrlock(rwlock_t *rwlp);


       int rw_unlock(rwlock_t *rwlp);


       int rw_tryrdlock(rwlock_t *rwlp);


       int rw_trywrlock(rwlock_t *rwlp);

DESCRIPTION
       Many threads can have simultaneous read-only access to data, while only
       one  thread  can  have  write  access  at any given time. Multiple read
       access with single write access is controlled by locks, which are  gen‐
       erally used to protect data that is frequently searched.


       Readers/writer  locks can synchronize threads in this process and other
       processes if they are allocated in writable  memory  and  shared  among
       cooperating  processes (see mmap(2)), and are initialized for this pur‐
       pose.


       Additionally, readers/writer locks must be initialized  prior  to  use.
       rwlock_init() The readers/writer lock pointed to by rwlp is initialized
       by rwlock_init(). A readers/writer lock is capable  of  having  several
       types  of  behavior,  which  is specified by type. arg is currently not
       used, although a future type may define new behavior parameters by  way
       of arg.


       The type argument can be one of the following:


       USYNC_PROCESS    The  readers/writer  lock  can  synchronize threads in
                        this process and other processes.  The  readers/writer
                        lock should be initialized by only one process. arg is
                        ignored. A readers/writer lock initialized  with  this
                        type,  must be allocated in memory shared between pro‐
                        cesses, either in Sys V shared memory  (see  shmop(2))
                        or  in  memory  mapped  to a file (see mmap(2)). It is
                        illegal to initialize the object this way and  to  not
                        allocate it in such shared memory.


       USYNC_THREAD     The  readers/writer  lock  can  synchronize threads in
                        this process, only. arg is ignored.




       The type argument can be augmented by the bitwise-inclusive-OR of  zero
       or more of the following flags:


       RWLOCK_SCALABLE    The  readers/writer  lock  that  is  NUMA-aware  and
                          scales well on large systems. A readers/writer  lock
                          of this type can synchronize threads in this process
                          only. As additional memory is allocated during  ini‐
                          tialization, this type of lock cannot be initialized
                          by allocation in zeroed  memory.  Initialization  of
                          this  type  of  lock can fail if insufficient memory
                          exist to initialize.  Scalable  readers/writer  lock
                          must  be  destroyed  when  it is no longer needed to
                          avoid memory leaks.




       Additionally, readers/writer locks can be initialized by allocation  in
       zeroed memory. A type of USYNC_THREAD is assumed in this case. Multiple
       threads must not  simultaneously  initialize  the  same  readers/writer
       lock. And a readers/writer lock must not be re-initialized while in use
       by other threads.


       The following are default readers/writer  lock  initialization  (intra-
       process):

         rwlock_t rwlp;
         rwlock_init(&rwlp, NULL, NULL);




       or

         rwlock_init(&rwlp, USYNC_THREAD, NULL);



       or

         rwlock_t  rwlp  =  DEFAULTRWLOCK;



       The  following  is  a  customized  readers/writer  lock  initialization
       (inter-process):

         rwlock_init(&rwlp, USYNC_PROCESS, NULL);



       The following is a customized scalable readers/writer lock  initializa‐
       tion:

         rwlock_t rwlp;
         if (rwlock_init(&rwlp, USYNC_THREAD | RWLOCK_SCALABLE, NULL) == ENOMEM)
                perror("cannot initialize scalable readers/writer lock");



       Any  state  associated  with the readers/writer lock pointed to by rwlp
       are destroyed by rwlock_destroy() and the readers/writer  lock  storage
       space is not released.


       rw_rdlock()  gets  a read lock on the readers/writer lock pointed to by
       rwlp. If the readers/writer lock is currently locked for  writing,  the
       calling  thread  blocks until the write lock is freed. Multiple threads
       may simultaneously hold a read lock on a readers/writer lock.


       rw_tryrdlock() tries to get a read  lock  on  the  readers/writer  lock
       pointed  to  by rwlp. If the readers/writer lock is locked for writing,
       it returns an error; otherwise, the read lock is acquired.


       rw_wrlock() gets a write lock on the readers/writer lock pointed to  by
       rwlp.  If  the  readers/writer  lock is currently locked for reading or
       writing, the calling thread blocks until all the read and  write  locks
       are  freed. At any given time, only one thread may have a write lock on
       a readers/writer lock.


       rw_trywrlock() tries to get a write lock  on  the  readers/writer  lock
       pointed  to by rwlp. If the readers/writer lock is currently locked for
       reading or writing, it returns an error.


       rw_unlock() unlocks a readers/writer lock pointed to by  rwlp,  if  the
       readers/writer lock is locked and the calling thread holds the lock for
       either reading or writing. One of the other threads that is waiting for
       the  readers/writer  lock to be freed will be unblocked, provided there
       is other waiting threads. If the calling thread does not hold the  lock
       for  either  reading  or  writing, no error status is returned, and the
       program's behavior is unknown.

RETURN VALUES
       If successful, these functions return 0. Otherwise, a non-zero value is
       returned to indicate the error.

ERRORS
       The rwlock_init() function will fail if:

       EINVAL    type is invalid.


       ENOMEM    Insufficient  memory  exists to initialize the readers/writer
                 lock.



       The rw_tryrdlock() or rw_trywrlock() functions will fail if:

       EBUSY    The reader or writer lock  pointed  to  by  rwlp  was  already
                locked.



       These functions may fail if:

       EFAULT    rwlp or arg points to an illegal address.


ATTRIBUTES
       See attributes(7) for descriptions of the following attributes:


       tab()  box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) ATTRIBUTE TYPEAT‐
       TRIBUTE VALUE _ MT-LevelMT-Safe


SEE ALSO
       mmap(2), attributes(7)

NOTES
       These interfaces also available by way of:


       #include  <thread.h>


       If multiple threads are waiting for a readers/writer lock, the acquisi‐
       tion order is random by default. However, some implementations may bias
       acquisition order to avoid depriving writers. The  current  implementa‐
       tion favors writers over readers.



Oracle Solaris 11.4               13 Nov 2020                       rwlock(3C)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3