【问题标题】:NACHOS C++: Thread Fork to create data structuresNACHOS C++:创建数据结构的线程叉
【发布时间】:2011-12-07 12:09:48
【问题描述】:

当我在顶部声明和初始化我的 List 数据结构然后调用我的函数 generateID 时,我有一个运行良好的程序。如果我在顶部声明列表并在函数内初始化列表,它也可以工作。但是我遇到的问题是使用线程来创建列表。我不断收到分段错误。

在我的程序顶部,我有我的声明。

列出* aLine;

在底部,我有两个函数。

void CreateListA(int which)
{
   aLine = new List;
   currentThread->Yield();
}

void ThreadTest()
{
   Thread *gA = new Thread("Creates new List A");
   gA->Fork(CreateListA, 1);
   generateID();
}

现在,当我运行线程测试时,出现分段错误。我猜想在使用线程创建列表时,内存都搞砸了。但是我想不通为什么会有这个问题?我以相同的方式(使用线程)创建了一个播放器对象,并且程序运行良好。现在我正在尝试创建 List 数据结构,但它失败了。 ***注意 generateID() 使用 append 和 remove 来操作列表。

【问题讨论】:

  • 我所说的分段错误实际上是指分段错误

标签: c++ multithreading list fork nachos


【解决方案1】:

在你 Fork 新线程后,generateID() 会立即执行:线程可能尚未启动,或者它可能正在创建列表。

也许 generateID() 应该是不同线程中的函数,并且列表的创建应该在主线程中。

【讨论】:

  • 这是正确的想法。调用函数时,列表还没有准备好。虽然我不完全理解为什么在调用函数之前不会完成列表的创建,但似乎是这样。谢谢
  • 你无法控制新线程的执行时间,除非你使用一些同步方法(例如系统可能会在你创建新线程几秒钟后启动它,同时它继续执行主线程,即fork()之后的指令在新线程启动之前执行)
【解决方案2】:

我认为Fork创建了一个新线程,因此,genereteID() 可能在主线程中操作尚未创建的列表。尝试在线程中调用genereteID(),确保确实创建了列表。如果没有,请检查genereteID() 正确的创建和列表初始化。

【讨论】:

  • 我无法使用该测试,因为我制作了一大堆列表,GenerateID 同时操作所有列表。不过,有可能是列表没有正确创建,但我仍然不知道如何修复它。
  • 一种简单的测试方法是在genereteID() 中添加一个循环以等待创建列表:类似于while (!aLine);。当然,在程序开始时将aLine初始化为NULL。
猜你喜欢
  • 2014-04-09
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多