Difference between revisions of "Ns critsec"

From AOLserver Wiki
Jump to navigation Jump to search
(Added an example)
(Added multiple sequential calls to ns_critsec enter to the example)
Line 31: Line 31:
 
Is this the right way to use this command? The example is contrived, but I wanted to call ns_critsec multiple times.
 
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 either of these procs, no other
+
     # If a thread is executing any of these procs, no other
     # thread can execute any of these procs until first first
+
     # thread can execute any of these procs until the first
 
     # thread has completely finished.
 
     # thread has completely finished.
 
      
 
      
Line 38: Line 38:
 
      
 
      
 
     proc write_special_file {data} {
 
     proc write_special_file {data} {
         ns_critsec enter [nsv_get . special_file_critsec]
+
         set critsec [nsv_get . special_file_critsec]
 +
        ns_critsec enter $critsec
 
         set handle [open special_file w]
 
         set handle [open special_file w]
 
         puts $handle $data
 
         puts $handle $data
 
         close $handle
 
         close $handle
         ns_critsec leave [nsv_get . special_file_critsec]
+
         ns_critsec leave $critsec
 
     }
 
     }
 
      
 
      
 
     proc read_special_file {} {
 
     proc read_special_file {} {
         ns_critsec enter [nsv_get . special_file_critsec]
+
         set critsec [nsv_get . special_file_critsec]
 +
        ns_critsec enter $critsec
 
         set handle [open special_file r]
 
         set handle [open special_file r]
 
         set result [read $handle]
 
         set result [read $handle]
 
         close $handle
 
         close $handle
         ns_critsec leave [nsv_get . special_file_critsec]
+
         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
 
         return $result
 
     }
 
     }

Revision as of 20:09, 21 June 2006

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 leaves 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

ns_cond, ns_event, ns_mutex, ns_thread

Category Documentation - Category Core Tcl API