как заблокировать простой массив байтов - PullRequest
0 голосов
/ 16 апреля 2011

у меня есть данные («данные без знака [480] [640] [4]») и два потока

thisThread1FunctinIsCalledForExampleAbout50CallsPerSecond () {fill (data);// и заполняет данные}

thisThread2FunctionIsCalledAbout1TimePerSecond () {use (data);// и использует данные (не только читает, но и обрабатывает их)

}

Я новичок в многопоточности и столкнулся с основной проблемой: у меня есть «условия гонки»здесь - поток 1 изменяет и «портит» данные, а поток 2 «использует» их - что я должен сделать, чтобы предотвратить это?

tnx для ответов, извините за мой слабый английский

1 Ответ

1 голос
/ 16 апреля 2011

Я никогда не писал ничего для цели c, но, насколько я понимаю, вы бы сделали что-то подобное для защиты доступа к вашим данным:

lock = [[NSLock alloc] init];

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

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

Идея состоит в том, чтобы использовать блокировку, чтобы убедиться, что толькоодин поток обращается к данным в любое время.

Если вы выполняете много работы, обрабатывая данные (читая их), возможно, вы захотите сделать копию данных внутри блокировки, а затем выйти из нее.Затем вы можете безопасно использовать копию созданных вами данных, находясь внутри блокировки, не беспокоясь о том, что поток записи изменит ее под вами.

Вы хотите, чтобы время, которое вы заблокировали, было как можно более коротким, поскольку вы потенциально блокируете другой поток и тратите ресурсы впустую, если блокируете на длительные периоды.

Если вы делаете копию данных, вы ДОЛЖНЫ сделать копию внутри замка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...