読者です 読者をやめる 読者になる 読者になる

マルチスレッドとstl

C++

スレッドの中でvectorに次々につっこんでいくプログラム。

#include <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using namespace std;

vector<int> v;

void greetingWithID(int i) {
  v.push_back(i);
}

int main(int argc, char *argv[]) {
  int n = 1000;
  boost::thread_group agroup;
  for (int i = 0; i < n; i++) {
	agroup.create_thread(boost::bind(greetingWithID, i));
  }
  agroup.join_all();

  BOOST_FOREACH(int i, v) {
	cout << i << endl;
  }
  return 0;
}

ときどき、せぐふぉで死ぬ。死なないときもある(困ったものだ)。

/tmp% ./a.out
a.out(97049,0xb0207000) malloc: *** error for object 0x100b50: double free
*** set a breakpoint in malloc_error_break to debug
zsh: segmentation fault  ./a.out

排他制御ができてないからかなー。

追記

mutexスレッド間の同期をしてくれるboost::mutexというのがあるらしく、こいつを使うと死ななくなった。

#include <iostream>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using namespace std;

vector<int> v;
boost::mutex key;

void greetingWithID(int i) {
  boost::mutex::scoped_lock lock(key);
  v.push_back(i);
}

int main(int argc, char *argv[]) {
  int n = 1000;
  boost::thread_group agroup;
  for (int i = 0; i < n; i++) {
	agroup.create_thread(boost::bind(greetingWithID, i));
  }
  agroup.join_all();

  BOOST_FOREACH(int i, v) {
	cout << i << endl;
  }
  return 0;
}

参考