[過去ログ] Boost総合スレ part9 (981レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
842: デフォルトの名無しさん [sage] 2012/02/11(土) 17:00:53.33 AAS
>>841
841(1): デフォルトの名無しさん [sage] 2012/02/11(土) 16:10:52.17 AAS
待つだけでいいならミューテックスでもいいのでは…そういう話ではない…?
#include <iostream>
#include <boost/thread.hpp>
#include <unistd.h>
void f( boost::mutex* guard )
{
std::cout << "worker: working" << std::endl;
std::cout << "worker: waiting until the mutex was unlocked" << std::endl; guard->lock();
std::cout << "worker: finished" << std::endl; guard->unlock();
}
int main()
{
boost::mutex m;
std::cout << "main: lock a mutex" << std::endl; m.lock();
std::cout << "main: create a worker" << std::endl; boost::thread worker(&f,&m);
std::cout << "main: sleeping 3 seconds" << std::endl; sleep(3);
std::cout << "main: unlock the mutex" << std::endl; m.unlock();
std::cout << "main: waiting for join" << std::endl; worker.join();
std::cout << "main: finished" << std::endl;
return 0;
}

$ ./sample
main: lock a mutex
main: create a worker
main: sleeping 3 seconds
worker: working
worker: waiting until the mutex was unlocked
main: unlock the mutex
main: waiting for join
worker: finished
main: finished
返信ありがとうございます。
管理側は仕事追加・終了許可時に、ワーカーのインスタンスそれぞれのメンバー変数であるconditionでnotifyすることで待ちを解除させています。
ワーカーは、管理側が仕事を追加すると通知を受けて仕事を開始するためにwhileループ内で待ちを行っています。(終了許可待ちと仕事待ちは共通のconditionとmutex)
void Worker::run() {
 while (true) {
   TaskData* task = NULL;
   while (_taskBag->getTasks(&task)) {
     job(task);
   }
   if (_finishable && _taskBag->numTasks() == 0) {
     _mtx.unlock();
     break;
   }
   _cond.wait(_mtx);
 }
}
ワーカーが複数いるので、mutexロック解除で待ち解除の通知を行うと、「仕事追加→いずれかのワーカーが仕事に着手」の後にmutexの所有権が管理側に戻ってこないかもしれないので難しそうです。
まぁ実装の仕方次第でmutexだけでもいけそうですが。

あとよくよく考えると_cond.wait(_mtx)の時に暗黙的に_cond.wait(mutex::scoped_lock(_mtx))のようになっているんでしょうか。
となると、ロックがwait解除後に再度かけられてしまうのはある意味当たり前ですね。

申し訳ありません。簡潔な文章で伝えるのがもの凄く難しいですねw
843
(1): デフォルトの名無しさん [sage] 2012/02/12(日) 07:46:49.88 AAS
waitにはmutexをロック済みのunique_lock渡す必要がある。直接mutexをwaitの渡せているのはたぶんVCのせい。
unique_lockのローカル変数を作ればunlockを呼び出す必要は無い。
condition_variableは他の変数と一緒に使うことが前提。
waitはnotifyの通知以外でも誤って解除されるのでbool変数などと合わせて使わないとだめ。
bool変数で確認するからにはmutexでの排他制御が必要。
844
(1): デフォルトの名無しさん [sage] 2012/02/13(月) 09:57:29.58 AAS
>>843
ありがとうございます。
排他制御が要らなく見えていたので、待ちの実現だけにcondition、mutex両方を使うことに冗長さを感じていたのですが、conditionはそもそも単体では使わないものなんですね。

ちなみに_cond.wait(_mtx)の記述はXcode4.2でもできています。C++の引数1つの場合の暗黙的なコンストラクターですね。
こういう場合に暗黙的にできてしまうと見落としてしまう場合があって危険だと感じます。
845
(1): デフォルトの名無しさん [sage] 2012/02/13(月) 11:57:41.20 AAS
>>844
それじゃあboostのバージョンが低いだけじゃないの?一時変数は非const参照に拘束できない。
846
(1): デフォルトの名無しさん [sage] 2012/02/13(月) 19:45:57.66 AAS
>>845
Boost 1.48です。ちなみに上記の_mtxはワーカークラスのメンバー変数です。
847: デフォルトの名無しさん [sage] 2012/02/13(月) 19:55:58.52 AAS
>>846
そうか。あとはコードを実際に追わないと分からないわ。
848
(1): デフォルトの名無しさん [sage] 2012/02/14(火) 07:34:07.70 AAS
boost::asioの非同期通信でhttpクライアントつくろうと思ってasync_read_someでデータ取ってるんだけど、何故か5kbくらいでデータが途中で切れちゃうんだ
誰かピンとくる人居ないか…助けてくれ
849: デフォルトの名無しさん [sage] 2012/02/15(水) 01:04:19.29 AAS
>>848
async_read_until使えば?
850
(1): デフォルトの名無しさん [sage] 2012/02/15(水) 15:40:45.11 AAS
今作成中のプログラムに<boost/thread.hpp>と<boost/thread/condition.hpp>をインクルードすると、システムのlocale_facets.tccとboostのshared_count.hppにおいて大量のエラーが発生します。
これらのファイル自体には問題は無く、何らかの依存関係でエラーが出ているんだろうということは想像がつくのですが、全く原因がわかりません。

何かこのような現象について心当たりのある方は居られないでしょうか。

Xcode4.2で、ヘッダーサーチパスには/opt/local/includeを(boostはこの下にインストール)設定しています。ライブラリーファイルのリンクも行っています。

よろしくお願いします。
851: デフォルトの名無しさん [] 2012/02/15(水) 19:46:15.26 AAS
>>850ですが、自己解決しました。申し訳有りません。

原因はboostを使っているソースファイルとは別のファイル内で定義した「swap」という名称のマクロでした。
それぞれのソースファイルを最終的にmain関数で参照する形となっていたためにboost内の何かとマクロ名が衝突したようです。

自分で定義したswapをユニークな名称に変更することで解決しました。

今後どなたかの参考になれば幸いです。
852: デフォルトの名無しさん [sage] 2012/02/15(水) 19:49:52.51 AAS
こらたかし!マクロは全部大文字にって言ったでしょ!
853: デフォルトの名無しさん [sage] 2012/02/15(水) 21:30:41.91 AAS
さすがにswapをマクロ名にするのはないな
854: デフォルトの名無しさん [] 2012/02/15(水) 22:26:50.21 AAS
cpp側なら問題なかったのですが、実装も含めたヘッダーに書いてしまったのが盲点の原因でした...
855: デフォルトの名無しさん [sage] 2012/02/15(水) 22:40:49.07 AAS
気が、狂っとる
856: デフォルトの名無しさん [sage] 2012/02/15(水) 22:45:19.13 AAS
君は優秀な人材だぜひマイクロソフトに就職しなさい
857
(1): デフォルトの名無しさん [sage] 2012/02/15(水) 22:53:13.67 AAS
>cpp側なら問題なかったのですが
よくねぇよ。
規格にちゃんと、

「標準ライブラリーのヘッダーをincludeする翻訳単位は、全標準ライブラリーヘッダーで宣言されている名前を#defineもしくは#undefしてはならない。」

と書いてある。
だから、ひとつでもどれか標準ライブラリーのヘッダーをincludeしたならば、swapという名前は#defineも#undefもできない。
858
(1): デフォルトの名無しさん [sage] 2012/02/15(水) 23:06:42.94 AAS
min
max
859
(1): デフォルトの名無しさん [sage] 2012/02/15(水) 23:27:50.00 AAS
>>857
swapって名前標準ライブラリーにあるの?
860: デフォルトの名無しさん [sage] 2012/02/15(水) 23:29:27.19 AAS
あぁalgorithmにあるのか。使ったこと無かったわ。
861: デフォルトの名無しさん [sage] 2012/02/15(水) 23:29:55.03 AAS
嘘だろ…
862: デフォルトの名無しさん [sage] 2012/02/15(水) 23:34:09.02 AAS
iostreamをインクルードするだけで使えるというのに・・・。
863: デフォルトの名無しさん [sage] 2012/02/15(水) 23:44:50.77 AAS
>>859
名前だぞ名前。
クラスのメンバーにも等しく適用されると何故わからないんだ。
多くの標準ライブラリのクラスがswapという名前のメンバーを持っているのを知らないのか。
864: デフォルトの名無しさん [sage] 2012/02/16(木) 00:11:46.32 AAS
>>858
MSは禿にごめんなさいしないといけないよね
865: デフォルトの名無しさん [sage] 2012/02/16(木) 03:25:04.66 AAS
C++にテンプレートが無い様な時代から既に用意されてたんだから
後出しのハゲが謝りお願いすべき
866: デフォルトの名無しさん [sage] 2012/02/16(木) 03:49:30.66 AAS
小文字が入ってるマクロ名は紛らわしいから
コンパイラが警告吐いてくれたらいいのにな
1-
あと 115 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.018s