RustでTcpStreamを書き込みと読み込みに利用する

以前RustでTcpStreamを複数スレッドで共有し、それぞれ読み込み、書き込み用に利用するためにArc<Mutex>を使っていたのですが、改めて調べてみますとTcpStreamにはtry_clone()というメソッドがもともと用意されているようでした。 steavevaivai.hatenablog.com www.reddit.com

自前でArc<Mutex>でストリームをスレッド間で共有する場合ロックの制御が難しいと思われるのでtry_clone()を使ったほうが良さそうです。

続きを読む

QuickFIX/Jのカスタムフィールドについて考えてみる

QuickFIX/Jのメッセージでのカスタムフィールドについて考えてみました。動作検証はQuickFIX/Jのソースのサンプルに含まれるbanzaiとexecutorを動かしています。
https://github.com/quickfix-j/quickfixj/tree/master/quickfixj-examples

まず、banzai側でNewOrderSingleのメッセージを作成して送信する部分を修正し、9000のフィールドを追加します。
https://github.com/quickfix-j/quickfixj/blob/QFJ_RELEASE_2_2_0/quickfixj-examples/banzai/src/main/java/quickfix/examples/banzai/BanzaiApplication.java#L372

    public void send50(Order order) {
        quickfix.fix50.NewOrderSingle newOrderSingle = new quickfix.fix50.NewOrderSingle(
                new ClOrdID(order.getID()), sideToFIXSide(order.getSide()),
                new TransactTime(), typeToFIXType(order.getType()));
        newOrderSingle.set(new OrderQty(order.getQuantity()));
        newOrderSingle.set(new Symbol(order.getSymbol()));
        newOrderSingle.set(new HandlInst('1'));
        newOrderSingle.setString(9000, "CustomField");
        send(populateOrder(order, newOrderSingle), order.getSessionID());
    }
続きを読む

Arc<Mutex<T>>でスレッド間でデータを共有する場合のDropの必要性について

前回はArc<Mutex>でスレッド間でデータを共有する動作を確認しました。
steavevaivai.hatenablog.com

その延長で今回はTcpStreamを複数スレッドで共有し片方のスレッドは読み込み続けて、もう片方のスレッドで書き込み続ける場合の動作を確認したのですが、際に自前でMutexGuardをDropしたほうが良さそうでした。

最初に確認した実装は以下のようになります。

続きを読む

Arc<Mutex<T>>でスレッド間でデータを共有してみる

スレッド間でデータを共有するときOSスレッドを直接操作するのは大変な気がしたのでグリーンスレッドがcrossbeamを試してみたのですが、改めて公式のドキュメントを見てみるとちゃんと説明がありました。

doc.rust-jp.rs

ArcとMutexの組み合わせによりスレッド間でデータを安全に共有することが出来るようです。 まずArcについてですが、ArcにはRcがありどちらも参照カウントを使ったスマートポインタであり、データや状態を共有できるとあり、つまり複数の所有者を持てることを意味し、ArcとRcの違いとしてはArcにはスレッド安全性があるようです。またRustには原則として共有しているものには書き込みができないのですが、Mutexは複数のスレッド間でデータを共有するためのスマートポインタになっていましてMutexをArcで包むことにより複数スレッド間でデータを共有して編集、参照できるようです。

試しに昨日書いた複数スレッドでチャンネルを共有し、2つのスレッドでsendし1つのスレッドでreceiveしてカウンタを操作するプログラムを Arc<Mutex<T>> を使って書いてみました。

続きを読む

RustでCrossbeamのグリーンスレッドを試してみる

Rustでは所有権やライフタイムがあるおかげで安全な実装をすることが出来ますが、Rustを始めたばかりの人は同じインスタンスに対し複数スレッドで一つのスレッドで監視をして、もう一つのスレッドで操作するといったことを行いたくなった場合大分てこずると思います。自分も色々調べて大分てこずっているので、分かったことをまとめてみたいと思います。

Rustで扱えるスレッドについてはOSスレッドとグリーンスレッドがあり、RustBookの以下のドキュメントに説明があります。
https://doc.rust-jp.rs/book/second-edition/ch16-01-threads.html

OSスレッドはOSのAPI呼び出しによって得られるスレッドになっていまして、グリーンスレッドは仮想マシン上で管理されているスレッドになります。OSスレッドの方が性能が良いのですがRustの所有権のライフタイムによりてこずっていました。

続きを読む

QuickFIX/Jのサンプルに対してRustでリクエストを投げてみる

QuickFIX/Jとは

QuickFIX/JはFIXエンジンの実装になります。FIXエンジン自体が聞きなれないと思いますが、FIXエンジンは電子取引で使われるプロトコルであるFIXプロトコルの実装になります。FIXエンジンについては以下のリンクが参考になります。
https://javarevisited.blogspot.com/2012/01/what-is-fix-engine-in-fix-protocol.html

QuickFIX/Jの公式ページによると、もともとC++で実装されたQuickFIXをJavaで実装しなおしたもののようです。

QuickFIX/Jの実装は以下で確認できます。
github.com

続きを読む