如果线程执行的函子被移动,会发生什么情况?

用户487100

说我有一个仿函数F

struct F
{
    // <some member variables go here>
    void operator()() { while(true) /*do stuff affecting the state*/; }
};

如果我创建Fs的向量

std::vector<F> functorVec(10);

然后用这些函子开始一堆线程

for (int i = 0; i < functorVec.size(); ++i)
{
    boost::thread(functorVec[i]); 
}

现在我对我的向量做一些事情

functorVec.push_back(F());

如果向量展开并将其内容复制到新位置,这是否会导致线程发生未定义的行为?还是它们会崩溃?

似乎他们的状态已经改变,可能是在他们对其执行某些操作的过程中。实际上,将工作对象复制然后删除,对吗?由于此举与线程的执行是异步的,因此似乎是个坏消息。

我问是因为我希望能够保留每个运行各自线程的对象的集合。这些对象代表连接到系统的模块。我希望能够动态添加和分离模块。如果将对象存储在集合中不是一个好主意,那有什么选择呢?我是否必须在堆上分配它们并将指针存储在集合中?

如果这根本不是问题,您能解释一下原因吗?

法蒂克

参考中

启动线程

通过将可以无参数调用的可调用类型的对象传递给构造函数来启动新线程。然后将该对象复制到内部存储中,并在新创建的执行线程上调用。如果不能(或不能)复制对象,则可以使用boost :: ref传递对函数对象的引用。在这种情况下,Boost.Thread的用户必须确保所引用的对象的寿命超过新创建的执行线程。

由于线程参数已复制,因此在启动所有线程之后移动向量将不是问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果应用程序处于睡眠状态时执行PerformSelector会发生什么情况?

来自分类Dev

调用exec()时,线程会发生什么情况?

来自分类Dev

等待加入条件变量的线程会发生什么情况?

来自分类Dev

如果不将字体嵌入Flash,会发生什么情况?

来自分类Dev

如果rm在提示中途停止,会发生什么情况?

来自分类Dev

如果不关闭Docker容器,会发生什么情况?

来自分类Dev

如果在此代码中将变量i直接传递给线程,会发生什么情况?

来自分类Dev

如果在ThreadPool线程正在写入文件时关闭应用程序会发生什么情况?

来自分类Dev

使用cronjob移动大文件:如果mv在下次运行时仍在运行,会发生什么情况?

来自分类Dev

如果您尝试对MongoDB数据库的锁定部分执行操作,会发生什么情况?

来自分类Dev

如果在程序运行时删除程序执行程序,会发生什么情况?

来自分类Dev

如果在执行过程中修改了SQL Server作业步骤,会发生什么情况

来自分类Dev

如果您尝试对MongoDB数据库的锁定部分执行操作,会发生什么情况?

来自分类Dev

如果获取互斥锁之后发生中断,会发生什么情况

来自分类Dev

挂起负责处理消息的线程时,会发生什么情况?

来自分类Dev

当进程结束时,在Sleep()中间的线程会发生什么情况?

来自分类Dev

等待条件变量的线程持有的互斥锁会发生什么情况

来自分类Dev

从C中main返回时正在运行的线程会发生什么情况?

来自分类Dev

当原始类超出范围时,线程会发生什么情况

来自分类Dev

当线程进入Java中的同步块/方法时会发生什么情况

来自分类Dev

结束后在进程中启动的线程会发生什么情况

来自分类Dev

从C中main返回时,正在运行的线程会发生什么情况?

来自分类Dev

在同步方法内部的线程中的同步块会发生什么情况?

来自分类Dev

将可移动对象插入std :: set失败时会发生什么情况?

来自分类Dev

移动分配时左侧std :: vector资源会发生什么情况?

来自分类Dev

如果在其他线程仍在运行时调用exit(0),会发生什么情况?

来自分类Dev

如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

来自分类Dev

如果无法通过create()清除Model :: $ id,会发生什么情况?

来自分类Dev

如果尝试并最终在方法中返回布尔值,会发生什么情况

Related 相关文章

  1. 1

    如果应用程序处于睡眠状态时执行PerformSelector会发生什么情况?

  2. 2

    调用exec()时,线程会发生什么情况?

  3. 3

    等待加入条件变量的线程会发生什么情况?

  4. 4

    如果不将字体嵌入Flash,会发生什么情况?

  5. 5

    如果rm在提示中途停止,会发生什么情况?

  6. 6

    如果不关闭Docker容器,会发生什么情况?

  7. 7

    如果在此代码中将变量i直接传递给线程,会发生什么情况?

  8. 8

    如果在ThreadPool线程正在写入文件时关闭应用程序会发生什么情况?

  9. 9

    使用cronjob移动大文件:如果mv在下次运行时仍在运行,会发生什么情况?

  10. 10

    如果您尝试对MongoDB数据库的锁定部分执行操作,会发生什么情况?

  11. 11

    如果在程序运行时删除程序执行程序,会发生什么情况?

  12. 12

    如果在执行过程中修改了SQL Server作业步骤,会发生什么情况

  13. 13

    如果您尝试对MongoDB数据库的锁定部分执行操作,会发生什么情况?

  14. 14

    如果获取互斥锁之后发生中断,会发生什么情况

  15. 15

    挂起负责处理消息的线程时,会发生什么情况?

  16. 16

    当进程结束时,在Sleep()中间的线程会发生什么情况?

  17. 17

    等待条件变量的线程持有的互斥锁会发生什么情况

  18. 18

    从C中main返回时正在运行的线程会发生什么情况?

  19. 19

    当原始类超出范围时,线程会发生什么情况

  20. 20

    当线程进入Java中的同步块/方法时会发生什么情况

  21. 21

    结束后在进程中启动的线程会发生什么情况

  22. 22

    从C中main返回时,正在运行的线程会发生什么情况?

  23. 23

    在同步方法内部的线程中的同步块会发生什么情况?

  24. 24

    将可移动对象插入std :: set失败时会发生什么情况?

  25. 25

    移动分配时左侧std :: vector资源会发生什么情况?

  26. 26

    如果在其他线程仍在运行时调用exit(0),会发生什么情况?

  27. 27

    如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

  28. 28

    如果无法通过create()清除Model :: $ id,会发生什么情况?

  29. 29

    如果尝试并最终在方法中返回布尔值,会发生什么情况

热门标签

归档