2013-03-11 50 views
0

我可以在这里获得社区的意见。我有一个应用程序,其中有多个线程访问(this)类的成员,该类调用线程本身。问题是,当新线程在LinkedList成员中添加一个元素时,我可以看到LinkedList的count由于添加了元素而增加到1,但是在主线程中,新线程所做的更改没有反映出来。我甚至将当前对象的引用传递给了ParameterizedThreadStart,但它仍然不起作用。会员的多个线程更改不反映在主线程中

插图:

ParameterizedThreadStart^ pReceiveProc = gcnew ParameterizedThreadStart(this, &ActualClass::Receive); 
Thread^ pReceiveThread = gcnew Thread(pReceiveProc); 
pReceiveThread->Start(this); // passed the current instance 

线程方法:

void Receive(Object^ pObj) { 
    ActualClass^ l_Cls = dynamic_cast<ActualClass^>(pObj); 
    l_Cls->MyLinkList->AddLast("test"); 
    Console::WriteLine("{0}", l_Cls->MyLinkList->Count); //outputs 1 
} 

但如果我从主线程访问MyLinkList:

void MethodMainThread(){ 
    Console::WriteLine("{0}", MyLinkList->Count); //outputs 0 
} 

静态成员解决方案不是一个选项。

+0

在MethodMainThread()的上下文中,您确定变量l_Cls仍然引用您传递给其他线程的同一个列表吗? – 2013-03-11 05:45:27

+0

是的,因为我一直通过主线程的“this”引用,所以我编辑了我的帖子,MethodMainThread没有l_Cls,因为它是主线程,所以它应该直接访问MyLinkList – TravellingGeek 2013-03-11 05:47:06

+0

什么你的主程序看起来像什么?你是否在插入元素后真的检查计数?并知道LinkedList是不是线程安全的,所以使用锁 – 2013-03-11 05:51:55

回答

0

你不能像这样在线程之间共享数据。一个简单的方法是使用'lock'语句。这是相当直接和here's一个很好的解释。

+0

我已经在LinkList上有我的锁定机制 – TravellingGeek 2013-03-11 06:07:26

1

最有价值的是,你的辅助线程被抢占,你的主线程检查计数,然后辅助线程添加一个对象,尝试使用信号,并让主线程等待,直到辅助线程完成其操作。

+0

嗯..这可能不太可能,因为我在单元测试中手动跟踪它,所以我会在运行测试之前先让辅助线程完成这将调用主线程 – TravellingGeek 2013-03-11 06:12:49

+0

中的方法,但单元测试在分离线程本身上运行。没有使用线程检查,只是单线程可能会有一些其他问题。 – TalentTuner 2013-03-11 06:13:36

相关问题