2011-04-16 59 views
0

的简单阵列我已经数据( “无符号字符数据[480] [640] [4]”)和 两个线程如何锁定字节

thisThread1FunctinIsCalledForExampleAbout50CallsPerSecond() { 填充(数据); //并且它填充数据 }

thisThread2FunctionIsCalledAbout1TimePerSecond() { 使用(数据); //和它的使用数据(不仅读,还对其进行处理)

}

我在多线程完全的新手,我面临的一个基本问题: 我有“竞态条件”在这里 - 当线程2'使用'它们时,线程1改变并'损坏'数据 - 我该怎么做才能防止它?

TNX答案,对不起我的英语薄弱

+1

您需要锁定数据的任何使用或编辑 - 您使用的是哪种语言? – 2011-04-16 13:15:26

+0

objeclive c,有东西像[锁定锁];/* * /; [锁定解锁];那里 - 曾尝试过这两个功能,它似乎工作可能 - tnx的建议,好评 – 2011-04-16 19:08:21

回答

1

我从来没有写在Objective C的任何东西,但我的理解是,你会做这样的事情来保护对数据的访问:

lock = [[NSLock alloc] init]; 

readData(){ 
     [lock lock]; 
//read the data here 
     [lock unlock]; 
} 

writeDate(){ 
     [lock lock]; 
//write the data here 
     [lock unlock]; 
} 

这个想法是使用一个锁来确保在任何时候只有一个线程正在访问数据。

如果您在处理数据(读取数据)时做了大量工作,那么您可能需要在锁内复制数据,然后退出锁。然后,您可以安全地使用您在锁内创建的数据的副本,而不用担心写入线程将它更改为在您的下面。

您希望保持尽可能短的锁定时间,因为如果长时间锁定,可能会阻塞其他线程并浪费资源。

如果您制作了数据的副本,您必须在锁内制作副本。

+0

好吧,TNX,正如我之前说过的,我已经完成了那件事 - 它似乎工作 - 可能现在编也反应了一点当你警告我时,速度也会变慢,但现在它并不重要 – 2011-04-17 05:48:50