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

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
828: デフォルトの名無しさん [age] 2012/02/03(金) 08:07:34.00 AAS
ポコチン
829: デフォルトの名無しさん [age] 2012/02/05(日) 22:05:47.61 AAS
ちんぽこ
830: デフォルトの名無しさん [sage] 2012/02/06(月) 23:10:55.09 AAS
ちんぽこ商用ライセンスだと制限きついしなぁ
831
(1): デフォルトの名無しさん [sage] 2012/02/09(木) 00:01:35.59 AAS
VC2010 Essentialsを使っています。
boost::serializationを使うと、アプリケーションを作成するためのプロジェクトでも
.libと.expを作ってくれるようになるのですが、これを抑制する方法はないでしょうか?
832: デフォルトの名無しさん [sage] 2012/02/09(木) 00:02:11.18 AAS
ちんぼ
833: デフォルトの名無しさん [sage] 2012/02/09(木) 01:54:03.78 AAS
っぽ
834: デフォルトの名無しさん [sage] 2012/02/09(木) 02:07:40.85 AAS
ぬるぽ
835: デフォルトの名無しさん [sage] 2012/02/09(木) 12:57:55.72 AAS
>>831
前に別のライブラリで同じ症状に遭ったことがあるけど、解決策見つからず

本当にどうしても嫌なら、ビルド後のプロセスでdelするとか・・・
836
(1): デフォルトの名無しさん [sage] 2012/02/09(木) 15:29:48.48 AAS
libが生成されるってことはエクスポートテーブルもできてるんだから
ファイルを消せばいいってもんじゃないだろ

どこかで間違えて__delcspec(dllexport)が定義されてるんだろうね
837: デフォルトの名無しさん [sage] 2012/02/09(木) 18:34:24.22 AAS
serializationがらみで
外部リンク:codepad.org

boost::shared_ptrのシリアライズコードを改造して、std::shared_ptr用の物を書いたのですが、
コレにカスタムデリータのサポートを追加するいいアイデア無いでしょうか?
838: デフォルトの名無しさん [sage] 2012/02/09(木) 22:45:06.20 AAS
poco高すぎだろ
pro買わないとネットワーク系全滅だし
839: デフォルトの名無しさん [sage] 2012/02/10(金) 12:34:22.38 AAS
>>824
824(1): デフォルトの名無しさん [age] 2012/02/02(木) 16:01:00.05 AAS
ubuntuでboost入れたら一瞬でインスコ完了で使えるようになった
一方、Windowsではサイズがでかい上にビルドにかなり時間がかかる。
この差はなんでつか?ちなみにWindowsではVCで使う感じです
linuxでC++やるときってエディタ何使うんですか
emacsのタグジャンプの設定で苦労した覚えが
今はもっといいのあるんだろうか
840: デフォルトの名無しさん [sage] 2012/02/10(金) 17:27:39.08 AAS
現在Boostのthreadを使って、ワークパイルを管理するクラス、各スレッドに付随するクラス(ワーカーとします)を作っています。
ワーカーは仕事を一通り終えた後、管理クラスが終了許可を出すまで「待ち」を行うようにするため、mutexとconditionを用いています。
管理クラスが終了許可を出せば「待ち」が解除されてスレッドとして動作していた関数を完了するのですが、待ちが解除されるときにmutexにロックがかけられてしまいます(それより前でmutexにロックはかけていない)。
そのため、ワーカーが破棄されるときにmutexでunlock()関数を使わないとエラーが生じます。

ワーカーで行いたいことは通知が来るまで待つだけで、排他制御の必要はありませんが、わざわざunlock()を使わなければならないのでしょうか。
イメージ的にはconditionにmutexを渡さないwait()があれば期待通りになりそうなのですが、それは存在しません。

よろしくお願いします。また私の解釈に間違いがあれば指摘いただけると幸いです。
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
842: デフォルトの名無しさん [sage] 2012/02/11(土) 17:00:53.33 AAS
>>841
返信ありがとうございます。
管理側は仕事追加・終了許可時に、ワーカーのインスタンスそれぞれのメンバー変数である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
こらたかし!マクロは全部大文字にって言ったでしょ!
1-
あと 129 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.292s