これはおそらくあなたが望むことをするでしょう。まとめただけなので、構文エラーがある場合は事前にお詫び申し上げます。2 つの問題 ( の 3 番目と 4 番目のパラメーターが正しくないpthread_create()
) に対処し、割り当て管理に RAII を使用します。
#include <iostream>
#include <vector>
using namespace std;
struct Node
{
int value;
};
void *start(void* p)
{
Node* obj = (Node*)p;
cout << obj->value;
return NULL;
}
int main(int argc, char *argv[])
{
int n;
cin >> n;
if (n <= 0)
return EXIT_FAILURE;
std::vector<Node> nodes(n);
std::vector<pthread_t> threads(n);
for (int i=0;i<n;++i)
pthread_create(threads.data()+i, NULL, &start, nodes.data()+i);
std::for_each(threads.begin(), threads.end(),
[](pthread_t& t) { pthread_join(t, NULL); });
return EXIT_SUCCESS;
}
C++11 スレッド : 夕食のネタ
raw-pthreads を使用するよりも、C++11 のスレッド クラスとオブジェクト (thread、mutex、condition_variable など) を使用することをお勧めします。彼らは本当にミツバチの膝です。似たようなもの (自動計算された N を使用) が以下に表示されます。
#include <iostream>
#include <vector>
#include <thread>
#include <memory>
using namespace std;
struct Node
{
int value;
Node() : value() {}
// member function we're using as thread proc
void thread_proc(int n)
{
value = n;
}
};
int main(int argc, char *argv[])
{
// allocate nodes
vector<Node> nodes(std::max(std::thread::hardware_concurrency()+1, 4U));
// starts threads
vector<thread> threads;
for (int i=0; i<nodes.size(); ++i)
threads.emplace_back(std::bind(&Node::thread_proc, nodes.data()+i, i+1));
// wait for all threads to complete.
for(auto &t : threads)
t.join();
// proof we really did hit *our* nodes in the threads.
for (auto& node : nodes)
cout << "Node value: " << node.value << endl;
return EXIT_SUCCESS;
}
出力
Node value: 1
Node value: 2
Node value: 3
Node value: 4
Node value: 5