class_docstr: Critical section.
  
  A `CriticalSection` object is a resource in the graph which executes subgraphs
  in **serial** order.  A common example of a subgraph one may wish to run
  exclusively is the one given by the following function:
  
  ```python
  v = resource_variable_ops.ResourceVariable(0.0, name="v")
  
  def count():
    value = v.read_value()
    with tf.control_dependencies([value]):
      with tf.control_dependencies([v.assign_add(1)]):
        return tf.identity(value)
  ```
  
  Here, a snapshot of `v` is captured in `value`; and then `v` is updated.
  The snapshot value is returned.
  
  If multiple workers or threads all execute `count` in parallel, there is no
  guarantee that access to the variable `v` is atomic at any point within
  any thread's calculation of `count`.  In fact, even implementing an atomic
  counter that guarantees that the user will see each value `0, 1, ...,` is
  currently impossible.
  
  The solution is to ensure any access to the underlying resource `v` is
  only processed through a critical section:
  
  ```python
  cs = CriticalSection()
  f1 = cs.execute(count)
  f2 = cs.execute(count)
  output = f1 + f2
  session.run(output)
  ```
  The functions `f1` and `f2` will be executed serially, and updates to `v`
  will be atomic.
  
  **NOTES**
  
  All resource objects, including the critical section and any captured
  variables of functions executed on that critical section, will be
  colocated to the same device (host and cpu/gpu).
  
  When using multiple critical sections on the same resources, there is no
  guarantee of exclusive access to those resources.  This behavior is disallowed
  by default (but see the kwarg `exclusive_resource_access`).
  
  For example, running the same function in two separate critical sections
  will not ensure serial execution:
  
  ```python
  v = tf.compat.v1.get_variable("v", initializer=0.0, use_resource=True)
  def accumulate(up):
    x = v.read_value()
    with tf.control_dependencies([x]):
      with tf.control_dependencies([v.assign_add(up)]):
        return tf.identity(x)
  ex1 = CriticalSection().execute(
    accumulate, 1.0, exclusive_resource_access=False)
  ex2 = CriticalSection().execute(
    accumulate, 1.0, exclusive_resource_access=False)
  bad_sum = ex1 + ex2
  sess.run(v.initializer)
  sess.run(bad_sum)  # May return 0.0
  ```
class_docstr_tok: ["Critical","section",".","A","`","CriticalSection","`","object","is","a","resource","in","the","graph","which","executes","subgraphs","in","*","*","serial","*","*","order",".","A","common","example","of","a","subgraph","one","may","wish","to","run","exclusively","is","the","one","given","by","the","following","function",":","``","`","python","v","=","resource_variable_ops.ResourceVariable","(","0.0",",","name=","''","v","''",")","def","count","(",")",":","value","=","v.read_value","(",")","with","tf.control_dependencies","(","[","value","]",")",":","with","tf.control_dependencies","(","[","v.assign_add","(","1",")","]",")",":","return","tf.identity","(","value",")","``","`","Here",",","a","snapshot","of","`","v","`","is","captured","in","`","value","`",";","and","then","`","v","`","is","updated",".","The","snapshot","value","is","returned",".","If","multiple","workers","or","threads","all","execute","`","count","`","in","parallel",",","there","is","no","guarantee","that","access","to","the","variable","`","v","`","is","atomic","at","any","point","within","any","thread","'s","calculation","of","`","count","`",".","In","fact",",","even","implementing","an","atomic","counter","that","guarantees","that","the","user","will","see","each","value","`","0",",","1",",","...",",","`","is","currently","impossible",".","The","solution","is","to","ensure","any","access","to","the","underlying","resource","`","v","`","is","only","processed","through","a","critical","section",":","``","`","python","cs","=","CriticalSection","(",")","f1","=","cs.execute","(","count",")","f2","=","cs.execute","(","count",")","output","=","f1","+","f2","session.run","(","output",")","``","`","The","functions","`","f1","`","and","`","f2","`","will","be","executed","serially",",","and","updates","to","`","v","`","will","be","atomic",".","*","*","NOTES","*","*","All","resource","objects",",","including","the","critical","section","and","any","captured","variables","of","functions","executed","on","that","critical","section",",","will","be","colocated","to","the","same","device","(","host","and","cpu\/gpu",")",".","When","using","multiple","critical","sections","on","the","same","resources",",","there","is","no","guarantee","of","exclusive","access","to","those","resources",".","This","behavior","is","disallowed","by","default","(","but","see","the","kwarg","`","exclusive_resource_access","`",")",".","For","example",",","running","the","same","function","in","two","separate","critical","sections","will","not","ensure","serial","execution",":","``","`","python","v","=","tf.compat.v1.get_variable","(","``","v","''",",","initializer=0.0",",","use_resource=True",")","def","accumulate","(","up",")",":","x","=","v.read_value","(",")","with","tf.control_dependencies","(","[","x","]",")",":","with","tf.control_dependencies","(","[","v.assign_add","(","up",")","]",")",":","return","tf.identity","(","x",")","ex1","=","CriticalSection","(",")",".execute","(","accumulate",",","1.0",",","exclusive_resource_access=False",")","ex2","=","CriticalSection","(",")",".execute","(","accumulate",",","1.0",",","exclusive_resource_access=False",")","bad_sum","=","ex1","+","ex2","sess.run","(","v.initializer",")","sess.run","(","bad_sum",")","#","May","return","0.0","``","`"]
docstr: Creates a critical section.
docstr_tok: ["Creates","a","critical","section","."]
code: def __init__(
      self,
      name=None,
      shared_name=None,
      critical_section_def=None,
      import_scope=None,
  ):
      """Creates a critical section."""
      context.ensure_initialized()
      if critical_section_def and name is not None:
          raise ValueError(
              f"Arguments critical_section_def={critical_section_def} "
              f"and shared_name={shared_name} are mutually exclusive. "
              "Please only specify one of them."
          )
      if critical_section_def:
          raise ValueError(
              "Argument `critical_section_def` is not supported."
          )
      else:
          self._init_from_args(name, shared_name)
  
imports: import collections
  import contextlib
  import threading
  from tensorflow.python.eager import context
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import ops
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import control_flow_ops
  from tensorflow.python.ops import gen_resource_variable_ops
  from tensorflow.python.ops import tensor_array_ops
  from tensorflow.python.util import nest
  from tensorflow.python.util import object_identity
  from tensorflow.python.util.tf_export import tf_export
label_desc: Use image node_id 1 to create a new CriticalSection object  with example: obj = CriticalSection(name, shared_name, critical_section_def, import_scope)