[過去ログ] Boost総合スレ part9 (981レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
391: デフォルトの名無しさん [sage] 2011/03/04(金) 18:30:11.33 AAS
これが後世に残るゴミレススパイラルの始まりであった
680
(1): デフォルトの名無しさん [sage] 2011/10/30(日) 21:20:35.33 AAS
timed_join
731: デフォルトの名無しさん [sage] 2011/11/19(土) 02:13:30.33 AAS
>>724
724(3): デフォルトの名無しさん [sage] 2011/11/18(金) 13:41:41.76 AAS
VC++2008でエラーになる・・・
boost.moveが原因くさい

#include <boost/unordered_map.hpp>

int main()
{
struct data_type
{
boost::unordered_map<int, int> a;
};

data_type a;
const data_type b;
a = b;

return 0;
}
C++03でのmoveのエミュレーションの限界であり仕様
外部リンク[html]:www.boost.org
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
959: デフォルトの名無しさん [sage] 2012/06/24(日) 21:44:57.33 AAS
馬鹿には無理
963: デフォルトの名無しさん [sage] 2012/06/28(木) 20:18:55.33 AAS
>>961
961(1): デフォルトの名無しさん [sage] 2012/06/25(月) 23:15:27.12 AAS
所有権を持ってるインスタンスに返してもらえばいい
ごめん間違えたわ。親クラスでunique_ptrを返すように定義してあった場合、
手持ちのshared_ptrを返すにはって事だった。
thisかどうかはどうでも良かったわ。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.033s