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