# prac0703.rb
require 'thread'
memory = "10100101011010"
cs = Mutex::new

Thread::fork{ # 表示スレッド
  before = ""
  loop{
    cs.synchronize{
      if before != memory
        puts memory
        before = memory.dup
      end
    }
  }
}

Thread::fork{ # 書き換えスレッド1
  loop{
    sleep(0.5)
    cs.synchronize{
      memory.gsub!(/001/,"000")
    }
  }
}

Thread::fork{ # 書き換えスレッド2
  loop{
    sleep(0.5)
    cs.synchronize{
      memory.gsub!(/010/,"000")
    }
  }
}

Thread::fork{ # 書き換えスレッド3
  loop{
    sleep(0.5)
    cs.synchronize{
      memory.gsub!(/100/,"000")
    }
  }
}

Thread::fork{ # 書き換えスレッド4
  loop{
    sleep(0.5)
    cs.synchronize{
      memory.gsub!(/110/,"111")
    }
  }
}

Thread::fork{ # 書き換えスレッド5
  loop{
    sleep(0.5)
    cs.synchronize{
      memory.gsub!(/101/,"111")
    }
  }
}

Thread::fork{ # 書き換えスレッド6
  loop{
    sleep(0.5)
    cs.synchronize{
      memory.gsub!(/011/,"111")
    }
  }
}

loop{  # 親スレッドは無限ループ
}