Difference between revisions of "Ns critsec"
		
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
		
		
		
		
		
	
 (imported from WiKit id 543)  | 
				m  | 
				||
| (2 intermediate revisions by one other user not shown) | |||
| Line 23: | Line 23: | ||
: Enters the critical section.  The thread will block if another thread is already in the critical section.  | : Enters the critical section.  The thread will block if another thread is already in the critical section.  | ||
| − | * '''ns_critsec   | + | * '''ns_critsec leave''' ''object''  | 
: Leaves the critical section.  When the thread leaves the critical section as many times as it has entered, a notification will be sent to other threads that are waiting on the critical section.  | : Leaves the critical section.  When the thread leaves the critical section as many times as it has entered, a notification will be sent to other threads that are waiting on the critical section.  | ||
| Line 29: | Line 29: | ||
'''EXAMPLES'''  | '''EXAMPLES'''  | ||
| − |      #   | + | Is this the right way to use this command? The example is contrived, but I wanted to call ns_critsec multiple times.  | 
| + | |||
| + |      # If a thread is executing any of these procs, no other  | ||
| + |     # thread can execute any of these procs until the first  | ||
| + |     # thread has completely finished.  | ||
| + | |||
| + |     nsv_set . special_file_critsec [ns_critsec create]  | ||
| + | |||
| + |     proc write_special_file {data} {  | ||
| + |         set critsec [nsv_get . special_file_critsec]  | ||
| + |         ns_critsec enter $critsec  | ||
| + |         set handle [open special_file w]  | ||
| + |         puts $handle $data  | ||
| + |         close $handle  | ||
| + |         ns_critsec leave $critsec  | ||
| + |     }  | ||
| + | |||
| + |     proc read_special_file {} {  | ||
| + |         set critsec [nsv_get . special_file_critsec]  | ||
| + |         ns_critsec enter $critsec  | ||
| + |         set handle [open special_file r]  | ||
| + |         set result [read $handle]  | ||
| + |         close $handle  | ||
| + |         ns_critsec leave $critsec  | ||
| + |         return $result  | ||
| + |     }  | ||
| + | |||
| + |     proc change_special_file {data} {  | ||
| + |         set critsec [nsv_get . special_file_critsec]  | ||
| + |         ns_critsec enter $critsec  | ||
| + |         set result [read_special_file]  | ||
| + |         write_special_file $data  | ||
| + |         ns_critsec leave $critsec  | ||
| + |         return $result  | ||
| + |     }  | ||
'''SEE ALSO'''  | '''SEE ALSO'''  | ||
Latest revision as of 15:39, 29 August 2008
Man page: http://aolserver.com/docs/tcl/ns_critsec.html
NAME
- ns_critsec - Operate on critical section objects
 
SYNOPSIS
- ns_critsec option ?arg arg ...?
 
DESCRIPTION
- This command provides a mechanism to manipulate critical section objects. The legal options (which may be abbreviated) are:
 
- ns_critsec create
 
- Initializes a new critical section object and returns a handle to it.
 
- ns_critsec destroy object
 
- Destroys the critical section object and frees any resources it was using.
 
- ns_critsec enter object
 
- Enters the critical section. The thread will block if another thread is already in the critical section.
 
- ns_critsec leave object
 
- Leaves the critical section. When the thread leaves the critical section as many times as it has entered, a notification will be sent to other threads that are waiting on the critical section.
 
EXAMPLES
Is this the right way to use this command? The example is contrived, but I wanted to call ns_critsec multiple times.
   # If a thread is executing any of these procs, no other
   # thread can execute any of these procs until the first
   # thread has completely finished.
   
   nsv_set . special_file_critsec [ns_critsec create]
   
   proc write_special_file {data} {
       set critsec [nsv_get . special_file_critsec]
       ns_critsec enter $critsec
       set handle [open special_file w]
       puts $handle $data
       close $handle
       ns_critsec leave $critsec
   }
   
   proc read_special_file {} {
       set critsec [nsv_get . special_file_critsec]
       ns_critsec enter $critsec
       set handle [open special_file r]
       set result [read $handle]
       close $handle
       ns_critsec leave $critsec
       return $result
   }
   
   proc change_special_file {data} {
       set critsec [nsv_get . special_file_critsec]
       ns_critsec enter $critsec
       set result [read_special_file]
       write_special_file $data
       ns_critsec leave $critsec
       return $result
   }
SEE ALSO