C++ とJava などで Thread Pool を自分で作る
Menu
Synchronized Queue を自分で作る
Java / C を使って golang の channel に相当するものを作る同期機構が必要になる
C : pthread の pthread_mutex_lockとpthread_cond_wait Java : synchronized method(あるいは他の面白そうな言語 Haskell / Rust / Python / Perl )
ただし、OSのpipe/socketpair/socket を用いてはだめ。
同期機構には以下の二つの方法がある
Semaphore を作る
Semapore は排他制御されたカウンタを持ち、PとVの二つの操作を持つ。これをpthread_mutex_lockとpthread_cond_wait で作成する。
P カウンタを増やす。カウンタを待っているSemaphoreがいたら、それを起こす V カウンタを減らす。ゼロだったら待ちに入る。OSレベルで待つので CPU time を食わない利点がある。
CAS を作る
check and set を用いて busy wait する
Blocking Queue のAPI
Java の Blocking Queue のAPIを参考にしながら、
put takeを定義する。
Synchronized Queue のtest 1
送信Thread一つ、3つのThread受信Threadを用意する。受信Threadaにそれぞれ5つのデータを送り、順に受けとって終了することを確認する。終了データかどうかの判定を用意し、終了データが来たら受信Threadを停める。
pthread_thread_join で終了を待つ。
正しくデータを受信して終了することを確認せよ。
Java のSynchronizedQueue を Java Pathfinder で適切なassertを用意してテストして見よ。