FC2ブログ

[Win32API][Winsock][Development]WSAGetLastError()

 Windowsのネイティブで開発をしている(.NET 上のCLRではなく)と、エラーコードが、「誰の」エラーコードであるかということを理解していないとデバッグに困ってしまう。
 WSAGetLastError()は、このSocket APIを呼び出したスレッド上でのWinsockエラーコードのようだ。つまり内部的には、TLS(Thread LocalStorage)にエラーコードを保存しているように振舞っている。
 これは、プロセス単位のエラーコードではないということだ。スレッドAの上でWinsockエラーが起きた直後に、スレッドB上でWSAGetLastError()を実行しても、信頼できるエラーコードが取得できないということを意味する。
 .NET FrameworkやMFCのメッセージマップを使っていたり、スレッドプールをバリバリ使っているようなプログラムだと、とくに問題になりそうな予感がする。
 エラー処理をする際には、「誰が」エラーを引き起こしたのか、「誰の」エラーコードを参照したのか、ということを意識しなければならない。スレッド構成が複雑なプログラムであればなおのことこれは難しい問題となるだろう。
 だからこそ、マルチスレッドは難しい、と言われるゆえんなのだが。
スポンサーサイト



more...

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証
カレンダー
06 | 2010/07 | 08
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
最近の記事
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
いろいろリンクボタン
埋め込みe-Words