Как несколько потоков C ++ выполняются в методе класса - PullRequest
2 голосов
/ 27 сентября 2008

скажем, у нас есть класс C ++, такой как:

class MyClass
{
   void processArray( <an array of 255 integers> )
   {
     int i ;
     for (i=0;i<255;i++)
     {
        // do something with values in the array
     }
   }
}

и один экземпляр класса, например:

MyClass myInstance ;

и 2 потока, которые вызывают метод processArray этого экземпляра (в зависимости от того, как система выполняет потоки, возможно, в совершенно неправильном порядке). В этой области не используется блокировка мьютекса, поэтому оба потока могут войти.

Мой вопрос: что происходит с i? Имеет ли каждая область видимости свое собственное «i» или каждый входящий поток изменяет i в цикле for, вызывая странное постоянное изменение i.

Ответы [ 4 ]

15 голосов
/ 27 сентября 2008

i выделяется в стеке. Поскольку каждый поток имеет свой отдельный стек, каждый поток получает свою собственную копию i.

4 голосов
/ 27 сентября 2008

Будь осторожен. В приведенном примере метод processArray выглядит как reentrant (неясно, что происходит в // что-то сделать со значениями в массиве ) Если это так, никакой гонки не происходит, пока два или более потоков вызывают ее одновременно, и поэтому безопасно вызывать ее без какого-либо механизма блокировки. Для этого вы можете пометить как экземпляр, так и метод квалификатором volatile , чтобы пользователи знали, что блокировка не требуется. Была опубликована интересная статья Андрея Александреску о volatile квалификаторе и о том, как его можно использовать для написания правильных многопоточных классов. Статья опубликована здесь: http://www.ddj.com/cpp/184403766

0 голосов
/ 27 сентября 2008

Как сказал Адам, я - переменная, хранящаяся в стеке, и аргументы передаются, так что это безопасно. Когда вам нужно быть осторожным и применять мьютексы или другие механизмы синхронизации, это происходит, если вы обращались к переменным общего члена в одном и том же экземпляре класса или глобальных переменных в программе (даже в статической области видимости).

0 голосов
/ 27 сентября 2008

Поскольку я локальная переменная, она хранится в собственном стеке потока. Следовательно, вам не нужно защищать меня критическим разделом.

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