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を用意してテストして見よ。


Shinji KONO / Tue Jan 14 12:27:50 2020