Boost.Asioの並行処理モデル:なぜ同一ソケットでasync_writeを同時に呼び出してはいけないのか?
【Boost.Asio深解】同一ソケットでの同時async_writeはなぜ危険なのか?送信キューだけでは不十分
Boost.Asioを用いた高並行サーバーを開発する際、多くの開発者は以下のようなコードを書く傾向があります。
送信キュー + async_writeを連鎖的に送信
複数のスレッドからSession::Send()を呼び出し
mutexでキューを保護
一見すると、
「スレッドセーフ + 送信キュー = ...
7月30日 23:11 投稿
Javaの同時実行ユーティリティ: Semaphore, CountDownLatch, CyclicBarrierの応用と原理
Semaphoreの使用と原理
概要
適用シナリオ:同時に共有リソースにアクセスできるスレッドの上限を制限するために使用されます。
例:各時点で最大3つのスレッドがリソースにアクセスする
package concurrency.example;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Semaphore;
@Slf4j(topic = "c.ResourceLimiterExample")
public class ResourceLim ...
7月28日 16:37 投稿
Go言語におけるチャンネルの活用と基礎知識
Go言語のチャンネル(Channel)は、異なるgoroutine間でデータを安全にやり取りし、同期処理を実現するための強力な仕組みです。以下では、Goチャンネルに関する主要なポイントを紹介します。
基本的な概念
定義: `var dataCh chan string` は文字列型のチャンネルを定義します。
生成: `dataCh := make(chan string)` や `dataCh := make(chan string, 5)` でバッフ ...
7月24日 20:15 投稿
スノーフレークアルゴリズムにおけるSystem.currentTimeMillis()の最適化は本当に有効か
スノーフレークアルゴリズムではID生成時にSystem.currentTimeMillis()を使用して現在時刻を取得します。このメソッドは毎回システムコールを発行するため、高並行环境下ではパフォーマンスに影響を与える可能性があるという意見があります。通常のオブジェクト生成よりも時間がかかる場合があるのは、Javaヒープ内での操作ではなく、ネイティブメソッド呼び出しが含まれる ...
7月22日 21:49 投稿
Java Stream APIによる効率的なデータ処理の実践
Stream APIの核心機能
Java 8で導入されたStream APIは、コレクション処理を宣言的に記述できる革新的な機能です。従来の繰り返し処理とは異なり、パイプライン操作により可読性と生産性を飛躍的に向上させます。ここでは、実務で即座に活用できる高度なテクニックを紹介します。
独自コレクターの開発
標準のtoList()やgroupingBy()では対応しきれない要件の場合、Collec ...
7月16日 00:47 投稿
Javaの並行処理ユーティリティ:CountDownLatchとCyclicBarrierの使い方
CountDownLatchの概要
CountDownLatchは、スレッド間の同期を支援するためのユーティリティクラスです。このクラスは、一つまたは複数のスレッドが、他のスレッドが特定の操作を完了するのを待つことができるように設計されています。名前の通り、カウントダウン式のロックであり、指定された回数の「カウントダウン」が完了するまで、待機するスレッドをブロックします。 ...
7月2日 21:13 投稿
Pythonの並行処理:キュー、スレッドプール、プロセスプール、そしてコルーチン
キュー
キューはデータを一時的に保存するためのデータ構造で、特に並行処理において重要な役割を果たします。Pythonではqueueモジュールが提供されています。
import queue
# FIFOキュー(先入れ先出し)
q = queue.Queue(2)
q.put('データ1')
print(q.get()) # データ1
q.task_done()
q.join()
# LIFOキュー(後入れ先出し)- スタック
lifo_q = queue.LifoQueue()
l ...
6月26日 16:39 投稿
Rustにおける並行処理入門とシンプルなスレッド例
Rustでは、所有権システムと型チェックにより、多くの並行処理に関するバグがコンパイル時に検出される。この特性は「フェアレス・コンカレンシー(fearless concurrency)」と呼ばれ、開発段階で問題を修正できる点が大きな利点となる。
並行(Concurrent)と並列(Parallel)の違い
並行とは複数のタスクが独立して進行することを指し、必ずしも同時に実行されるわけで ...
6月18日 21:37 投稿
大規模IT企業における5年目エンジニアの技術面接体験談
大規模検索ログ解析におけるTopN問題の解法
大容量ファイルから頻出検索語を抽出する手法について考察する。メモリ制約下での効率的な処理が鍵となる。
分散処理による解決策
from collections import defaultdict
import heapq
def process_chunk(file_path, chunk_size=1024):
counter = defaultdict(int)
with open(file_path) as f:
while True:
...
6月18日 19:15 投稿
AQS(AbstractQueuedSynchronizer)の仕組みを徹底解説
AQS(AbstractQueuedSynchronizer)は、Javaにおけるロックやその他の同期コンポーネントを構築するための基盤フレームワークです。このクラスは、int型のstate変数で同期状態を管理し、内部にFIFO(先入れ先出し)の同期キューを持ちます。
AQSを利用するには、サブクラスが継承し、抽象メソッドを実装します。同期状態の操作に使う主要なメソッドは以下の通りです。
g ...
6月17日 16:32 投稿