トップページ⇒tech
981コメント259KB

Boost総合スレ part9

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2010/05/28(金) 11:49:47
過去スレ
Part 8 http://pc12.2ch.net/test/read.cgi/tech/1251446016/
part 7 http://pc12.2ch.net/test/read.cgi/tech/1232367742/
part 6 http://pc11.2ch.net/test/read.cgi/tech/1207749841/
part 5 http://pc11.2ch.net/test/read.cgi/tech/1192662575/
part 4 http://pc11.2ch.net/test/read.cgi/tech/1175663346/
part 3 http://pc11.2ch.net/test/read.cgi/tech/1158991211/
part 2 http://pc8.2ch.net/test/read.cgi/tech/1139313234/
part 1 http://pc8.2ch.net/test/read.cgi/tech/1091198276/

■関連サイト■
Boost C++ Libraries
http://www.boost.org/

Boost 翻訳プロジェクト
http://boost.cppll.jp/HEAD/

Let's Boost
http://www.kmonos.net/alang/boost/

boost info
http://shinh.skr.jp/boost/
0809Regex2012/01/09(月) 17:52:20.64
>>808
打ち合わせどうだった?
何言われたの??
0810boost::tuple2012/01/09(月) 20:23:36.80
さてと、C++11への引っ越しを始めるとするか・・・。
0811デフォルトの名無しさん2012/01/09(月) 20:26:00.89
corutineがいろいろ改変されたのあって
どれが一番いいのかわからない
x86 amd64 のwindows linux mac で動けばいいのだけど
0812progress_display2012/01/13(金) 23:37:40.00
@typeに登録しておこう(´;ω;`)
0813デフォルトの名無しさん2012/01/13(金) 23:51:00.44
shared_ptrってスレッドオフしてallocate_sharedすればintrusive_ptrとパフォーマンスたいして変わらんっすよね?
0814デフォルトの名無しさん2012/01/14(土) 05:42:46.00
shared_ptrのサイズはポインタ二つ分。
共有管理オブジェクトにはweak_ptr用のカウンタもある。
大した違いかどうかは場合による。
0815デフォルトの名無しさん2012/01/14(土) 09:35:55.06
メモリ intrusive_ptr
生成破棄 intrusive_ptr
参照カウント増減 shared_ptr
0816デフォルトの名無しさん2012/01/18(水) 15:11:46.99
ttp://www.boost.org/doc/libs/1_48_0/libs/math/doc/sf_and_dist/html/math_toolkit/policy/pol_ref/internal_promotion.html
自分で定義した(例えば多倍精度浮動小数点数)型を数学関数内部でも使える様にするにはどうすればいいですか?
0817デフォルトの名無しさん2012/01/18(水) 23:51:54.60
ttp://www.boost.org/doc/libs/1_48_0/libs/math/doc/sf_and_dist/html/math_toolkit/using_udt/concepts.html
やったことはないがその型に対してこれ↑を満たすように必要なものを自分で書けばboost::mathでその型を使えるんだろ
0818デフォルトの名無しさん2012/01/20(金) 03:32:32.30
void func2( boost::array<int, 3> & c)
{
c.assign( 0 );
}
error: invalid initialization of reference of type ‘boost::array<int, 3ul>&’ from expression of type ‘const boost::array<int, 3ul>’

arrayを参照引数にできないんだっけ?
0819デフォルトの名無しさん2012/01/20(金) 07:59:21.04
>>818
おまいはエラーメッセージも読めんのか?
0820デフォルトの名無しさん2012/01/20(金) 08:58:09.76
ああ!constついてました
0821デフォルトの名無しさん2012/01/21(土) 05:12:42.79
boost::fusion::list a の先頭要素が
a.begin()
で参照できないのがちょっと気持ち悪い
0822デフォルトの名無しさん2012/02/01(水) 23:49:52.05
bjamの利点がわからないのですが、autoconfとかを用いずbjamを利用してるのは何故でしょうか?
0823デフォルトの名無しさん2012/02/02(木) 00:18:21.01
POCOとほとんど同じ機能持つライブラリ
ありませんか?
0824デフォルトの名無しさん2012/02/02(木) 16:01:00.05
ubuntuでboost入れたら一瞬でインスコ完了で使えるようになった
一方、Windowsではサイズがでかい上にビルドにかなり時間がかかる。
この差はなんでつか?ちなみにWindowsではVCで使う感じです
0825デフォルトの名無しさん2012/02/02(木) 16:32:49.79
apt-get とかでパッケージをインストールしたんのなら、既にバイナリが含まれてるからだろ。
0826デフォルトの名無しさん2012/02/02(木) 17:06:15.79
なるへそ
Windowsでは全部落としてきて自分でビルドしたからか
0827デフォルトの名無しさん2012/02/03(金) 01:20:40.57
>>823
なんでpoco不可?
0828デフォルトの名無しさん2012/02/03(金) 08:07:34.00
ポコチン
0829デフォルトの名無しさん2012/02/05(日) 22:05:47.61
ちんぽこ
0830デフォルトの名無しさん2012/02/06(月) 23:10:55.09
ちんぽこ商用ライセンスだと制限きついしなぁ
0831デフォルトの名無しさん2012/02/09(木) 00:01:35.59
VC2010 Essentialsを使っています。
boost::serializationを使うと、アプリケーションを作成するためのプロジェクトでも
.libと.expを作ってくれるようになるのですが、これを抑制する方法はないでしょうか?
0832デフォルトの名無しさん2012/02/09(木) 00:02:11.18
ちんぼ
0833デフォルトの名無しさん2012/02/09(木) 01:54:03.78
っぽ
0834デフォルトの名無しさん2012/02/09(木) 02:07:40.85
ぬるぽ
0835デフォルトの名無しさん2012/02/09(木) 12:57:55.72
>>831
前に別のライブラリで同じ症状に遭ったことがあるけど、解決策見つからず

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

どこかで間違えて__delcspec(dllexport)が定義されてるんだろうね
0837デフォルトの名無しさん2012/02/09(木) 18:34:24.22
serializationがらみで
ttp://codepad.org/bp6RCbxw

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

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

よろしくお願いします。また私の解釈に間違いがあれば指摘いただけると幸いです。
0841デフォルトの名無しさん2012/02/11(土) 16:10:52.17
待つだけでいいならミューテックスでもいいのでは…そういう話ではない…?
#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
0842デフォルトの名無しさん2012/02/11(土) 17:00:53.33
>>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
0843デフォルトの名無しさん2012/02/12(日) 07:46:49.88
waitにはmutexをロック済みのunique_lock渡す必要がある。直接mutexをwaitの渡せているのはたぶんVCのせい。
unique_lockのローカル変数を作ればunlockを呼び出す必要は無い。
condition_variableは他の変数と一緒に使うことが前提。
waitはnotifyの通知以外でも誤って解除されるのでbool変数などと合わせて使わないとだめ。
bool変数で確認するからにはmutexでの排他制御が必要。
0844デフォルトの名無しさん2012/02/13(月) 09:57:29.58
>>843
ありがとうございます。
排他制御が要らなく見えていたので、待ちの実現だけにcondition、mutex両方を使うことに冗長さを感じていたのですが、conditionはそもそも単体では使わないものなんですね。

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

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

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

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

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

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

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

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

と書いてある。
だから、ひとつでもどれか標準ライブラリーのヘッダーをincludeしたならば、swapという名前は#defineも#undefもできない。
0858デフォルトの名無しさん2012/02/15(水) 23:06:42.94
min
max
0859デフォルトの名無しさん2012/02/15(水) 23:27:50.00
>>857
swapって名前標準ライブラリーにあるの?
0860デフォルトの名無しさん2012/02/15(水) 23:29:27.19
あぁalgorithmにあるのか。使ったこと無かったわ。
0861デフォルトの名無しさん2012/02/15(水) 23:29:55.03
嘘だろ…
0862デフォルトの名無しさん2012/02/15(水) 23:34:09.02
iostreamをインクルードするだけで使えるというのに・・・。
0863デフォルトの名無しさん2012/02/15(水) 23:44:50.77
>>859
名前だぞ名前。
クラスのメンバーにも等しく適用されると何故わからないんだ。
多くの標準ライブラリのクラスがswapという名前のメンバーを持っているのを知らないのか。
0864デフォルトの名無しさん2012/02/16(木) 00:11:46.32
>>858
MSは禿にごめんなさいしないといけないよね
0865デフォルトの名無しさん2012/02/16(木) 03:25:04.66
C++にテンプレートが無い様な時代から既に用意されてたんだから
後出しのハゲが謝りお願いすべき
0866デフォルトの名無しさん2012/02/16(木) 03:49:30.66
小文字が入ってるマクロ名は紛らわしいから
コンパイラが警告吐いてくれたらいいのにな
0867デフォルトの名無しさん2012/02/16(木) 07:22:59.71
assertみたいなマクロ実装関数で警告が出ることになるか
ところでassertをキーワードに昇格させて定数式なら
コンパイル時エラー出す設計にはできなかったのかな
そうするとstatic_assertと書き分けなくて良いような気もするけれど
0868デフォルトの名無しさん2012/02/16(木) 12:13:03.95
例によってCとの互換性が
0869デフォルトの名無しさん2012/02/16(木) 12:38:53.66
staticの方はともかくassertってあんまし使わなくねーか?
0870デフォルトの名無しさん2012/02/16(木) 12:38:56.08
iOS開発でObjCのコンテナクラス類使わずにどうもSTL/boost多用してしまうんだけど
果たしてこれはよくないのかどうか・・・
0871デフォルトの名無しさん2012/02/16(木) 15:37:52.34
threadのwaitってどこのサイトみても
…
while(!ready) {
 cond.wait(lock);
}
…
のようになっていますよね。これを起こす場合には
ready = true;
cond.notify_all();
とすると思うのですが、while分の!readyを判定してからcon.waitをかけるまでの間に上記の起こすコードが呼ばれた場合には、動かなくなってしまう気がします。

これを回避する方法などあるのでしょうか。timed_waitでしょうか。
0872デフォルトの名無しさん2012/02/16(木) 18:47:36.71
>>871
cond.wait(lock);でロックを要求している素晴らしい設計を無視するなよ
0873デフォルトの名無しさん2012/02/16(木) 19:01:27.73
>>872
ありがとうございます。
よくよく考えてみるとwhile文の前と起こすコードの先頭でミューテックスをロックすればいいんですね。
今まで引っかかっていたものがスッキリとれました!
0874デフォルトの名無しさん2012/02/16(木) 21:10:13.56
>>872,873を理解するまで1時間かかってしまった
0875デフォルトの名無しさん2012/02/27(月) 18:51:24.80
1.49出たのに反応なしか
0876デフォルトの名無しさん2012/03/01(木) 01:31:34.53
小学生並みの発想だな
0877デフォルトの名無しさん2012/03/04(日) 14:05:48.47
中学生並みの反応だな
0878デフォルトの名無しさん2012/03/06(火) 21:26:03.54
大学生並の考察だな
0879デフォルトの名無しさん2012/03/06(火) 22:17:31.08
院生並の皮肉だな
0880デフォルトの名無しさん2012/03/06(火) 23:36:14.79
社会人並みの判断だな
0881デフォルトの名無しさん2012/03/06(火) 23:51:07.07
年金生活者は余裕だな。
0882デフォルトの名無しさん2012/03/07(水) 00:00:44.76
病院生活並の苦労だな
0883デフォルトの名無しさん2012/03/07(水) 09:58:05.77
世捨て人並の達観だな
0884デフォルトの名無しさん2012/03/07(水) 18:03:57.16
銀河皇帝並みの独断だな
0885デフォルトの名無しさん2012/03/10(土) 00:18:09.27
原子核級の大志だな
0886デフォルトの名無しさん2012/03/10(土) 14:27:31.51
風俗嬢並の偏屈だな
0887デフォルトの名無しさん2012/03/11(日) 00:11:07.28
俺並みの性欲だな
0888デフォルトの名無しさん2012/03/11(日) 00:46:18.10
風説の流布
0889デフォルトの名無しさん2012/03/11(日) 02:29:45.81
痛風の呂布
0890デフォルトの名無しさん2012/03/11(日) 09:45:46.39
風呂の風俗
0891デフォルトの名無しさん2012/03/11(日) 18:41:57.17
温泉の効能
0892デフォルトの名無しさん2012/03/11(日) 20:16:36.14
駄レスがスレをboostする!
0893デフォルトの名無しさん2012/03/11(日) 23:11:17.86
歌舞伎町の893
0894デフォルトの名無しさん2012/03/11(日) 23:36:25.70
ゲスの極み
0895デフォルトの名無しさん2012/03/11(日) 23:45:41.65
お肉の厚み
0896デフォルトの名無しさん2012/03/12(月) 00:07:56.91
boostってC++11の要素は取り込みはじめてるの?
0897デフォルトの名無しさん2012/03/12(月) 00:33:35.99
C++11がBoostを取り込んだの間違いだろ
Boost.Moveのことなら知らん
0898デフォルトの名無しさん2012/03/12(月) 00:37:49.12
Boost.Chrono とかは C++11 からの逆輸入。
0899デフォルトの名無しさん2012/03/12(月) 00:49:09.56
既存コンパイラで動くようにしてくれてるならいいことだ
0900デフォルトの名無しさん2012/03/13(火) 00:46:51.29
◆ 便利な今までに出た風説の流布一覧
伝説の流川
伝説の呂布
解説の掛布
風疹の漁夫
ふーてんの流浪
妖鳥の流布
入れ墨の鯨布
風の谷の呂布
骨折に湿布
聖教新聞の配布
電設の鈴木
通風の湿布
テンセルの毛布
テンソルの分布
ピンサロの主婦
風雪ながれ旅
風雪の露天風呂
風俗で炉利
風俗の幕府
風てんのトラ
温泉の掛川
風の谷のナウシカ
季布の一諾
空席の椅子
秀策の棋譜
特攻の拓
ピンフの20符
0901progress_display2012/03/19(月) 23:18:49.04
最近おれっちの話が出来ていないが、C++11先取りしておれっちを実装するコンパイラってまだ出てきてないの?
0902デフォルトの名無しさん2012/03/24(土) 20:20:56.52
serialization を使ったときに、exe ファイルにいろんなシンボルがエクスポートされるのを防ぐ方法ってないでしょうか?
0903デフォルトの名無しさん2012/03/25(日) 11:34:46.67
仕様です
0904営利利用に関するLR審議中@詳細は自治スレへ2012/04/01(日) 06:51:48.14
>>901
あれ、あなた風の噂で左遷されたって噂を聞いてたけど・・・?
0905営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:36:20.60
boost::optional<int> test () { return 1; }

void func {
if (auto i = test() && i.get() != -1) {
return ;
}
}
これコンパイル通らないけどどうして?
0906営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 20:00:01.39
funcの定義
0907営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 20:16:53.92
void func () {
      ↑
0908デフォルトの名無しさん2012/04/11(水) 21:59:09.93
>>905 エラーメッセージ見ろよ。
レス数が900を超えています。1000を超えると表示できなくなるよ。