创建的线程多于预期
More threads created than expected
您可以找到程序 here
我正在消息传递框架 0MQ 中构建一个程序。我尝试实现我在 here
中发布的内容
用 g++ -std=c++11 test.cpp -o test -lzmq -lpthread
.
编译的程序
到运行程序,传递一个参数作为你想要的线程号。然后将该参数分配给变量 worker_num
.
在主线程中,我设置线程:
vector<thread> pool;
for(int i = 0; i < worker_num; i++)
{
cout << "main() : creating thread, " << i << endl;
pool.push_back(thread(task1, (void *)&context, i));
}
我想确保所有工作线程在主线程向它们分发作业之前都已成功连接到主线程。
while(true)
{
if(sync_done)
{
cout << "sync done in main thread" << endl;
break;
}
zmq::message_t sync_msg(4);
memcpy((void *)sync_msg.data(), SYNC_MSG, SYNC_MSGLEN);
for(int i = 0; i < worker_num; i++)
distask_socket.send(sync_msg);
for(int i = 0; i < worker_num; i++)
{
if(sync_done)
break;
if(i != 0)
this_thread::sleep_for(chrono::milliseconds(500));
zmq::message_t res_msg;
int ret = getres_socket.recv(&res_msg, ZMQ_DONTWAIT);
if(ret == -1 && errno == EAGAIN)
continue;
int threadID = stoi(string((char *)res_msg.data()));
sync_done = if_sync_done(threadID, sync_array, worker_num);
}
}
所以主线程所做的是:每次将带有 PUSH 端点的 sync
条消息推送到工作线程,然后从其 PULL 端点读取确认消息。如果主线程检索到#worker_num 条确认消息,则同步完成。来自 worker 的同步消息的格式是:字符串中的工作线程 ID。因此线程 0 会将字符串中的 0
传递回主线程。
但是运行宁我的程序:
$ ./test 1
main() : creating thread, 0
thread id:0
thread 0 receives: sync
thread 0 sends: 0
thread 0 sync done
main thread receives sync msg from thread 1 # you may get many copies of this msg
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted
main thread receives sync msg from thread 1
表示线程创建了 2 个线程:线程 0 和线程 1。知道为什么吗?我确实传递了 1
作为参数。请注意,如果您自己 运行 程序,您可能会得到其他输出。
更新:
程序已更新:here。
我终于明白是怎么回事了。
预期输出,您看到线程 0 将 0
传递给主线程以通知同步完成:
$ ./test 1
input parameter is: 1
main() : creating thread, 0
thread 0 receives: sync
to_string 0
thread 0 sends: 0, with size: 1
thread 0 sync done
pass 0 to if_sync_done
main thread receives sync msg from thread 0
sync done in main thread
意外输出,您看到不可打印的字符被传递给 stoi()
:
$ ./test 1
input parameter is: 1
main() : creating thread, 0
thread 0 receives: sync
to_string 0
thread 0 sends: 0, with size: 1
thread 0 sync done
pass to if_sync_done # !!!!!
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted
看来我用错了message_t
。所以我需要确保在主线程将内容传递给stoi()
之前,缓冲区仍然存在
我会自己添加一个答案。
您可以找到程序 here
我正在消息传递框架 0MQ 中构建一个程序。我尝试实现我在 here
中发布的内容用 g++ -std=c++11 test.cpp -o test -lzmq -lpthread
.
到运行程序,传递一个参数作为你想要的线程号。然后将该参数分配给变量 worker_num
.
在主线程中,我设置线程:
vector<thread> pool;
for(int i = 0; i < worker_num; i++)
{
cout << "main() : creating thread, " << i << endl;
pool.push_back(thread(task1, (void *)&context, i));
}
我想确保所有工作线程在主线程向它们分发作业之前都已成功连接到主线程。
while(true)
{
if(sync_done)
{
cout << "sync done in main thread" << endl;
break;
}
zmq::message_t sync_msg(4);
memcpy((void *)sync_msg.data(), SYNC_MSG, SYNC_MSGLEN);
for(int i = 0; i < worker_num; i++)
distask_socket.send(sync_msg);
for(int i = 0; i < worker_num; i++)
{
if(sync_done)
break;
if(i != 0)
this_thread::sleep_for(chrono::milliseconds(500));
zmq::message_t res_msg;
int ret = getres_socket.recv(&res_msg, ZMQ_DONTWAIT);
if(ret == -1 && errno == EAGAIN)
continue;
int threadID = stoi(string((char *)res_msg.data()));
sync_done = if_sync_done(threadID, sync_array, worker_num);
}
}
所以主线程所做的是:每次将带有 PUSH 端点的 sync
条消息推送到工作线程,然后从其 PULL 端点读取确认消息。如果主线程检索到#worker_num 条确认消息,则同步完成。来自 worker 的同步消息的格式是:字符串中的工作线程 ID。因此线程 0 会将字符串中的 0
传递回主线程。
但是运行宁我的程序:
$ ./test 1
main() : creating thread, 0
thread id:0
thread 0 receives: sync
thread 0 sends: 0
thread 0 sync done
main thread receives sync msg from thread 1 # you may get many copies of this msg
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted
main thread receives sync msg from thread 1
表示线程创建了 2 个线程:线程 0 和线程 1。知道为什么吗?我确实传递了 1
作为参数。请注意,如果您自己 运行 程序,您可能会得到其他输出。
更新:
程序已更新:here。
我终于明白是怎么回事了。
预期输出,您看到线程 0 将 0
传递给主线程以通知同步完成:
$ ./test 1
input parameter is: 1
main() : creating thread, 0
thread 0 receives: sync
to_string 0
thread 0 sends: 0, with size: 1
thread 0 sync done
pass 0 to if_sync_done
main thread receives sync msg from thread 0
sync done in main thread
意外输出,您看到不可打印的字符被传递给 stoi()
:
$ ./test 1
input parameter is: 1
main() : creating thread, 0
thread 0 receives: sync
to_string 0
thread 0 sends: 0, with size: 1
thread 0 sync done
pass to if_sync_done # !!!!!
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted
看来我用错了message_t
。所以我需要确保在主线程将内容传递给stoi()
之前,缓冲区仍然存在
我会自己添加一个答案。