2015-04-20 1 views
4

Хотелось бы узнать, может ли моя программа участвовать в гонке или нет? Если да, пожалуйста, дайте мне пример, потому что я не вижу никого.Понимание состояния гонки

#define STRING_SIZE 1024 
char *string; 
int main(int argc,char**argv){ 
int length; 
if(argc != 2) return ; 
length = strlen(string); 
strncpy(string+length,argv[1],STRING_SIZE,STRING_SIZE-length); 
return 0; 

} 

что делать, если я сделаю замок? это исправляет проблему?

#define STRING_SIZE 1024 
int lock; 
char *string; 
int main(int argc,char**argv){ 
int length; 
while(lock != 0){} 
lock = 1; 
if(argc != 2) return ; 
length = strlen(string); 
strncpy(string+length,argv[1],STRING_SIZE,STRING_SIZE-length); 
lock = 0; 
return 0; 
} 
+2

для условий гонки вы должны иметь 2 потока или обрабатывать доступ к одному объекту в одно и то же время и по крайней мере один из них хочет изменить этот объект. можете ли вы указать, что является вашим процессом или потоками и каков ваш объект? –

+0

ну переменная * строка находится в общей памяти, поэтому я предполагаю, что если я запустил программу дважды, это сделало бы условие гонки нет? –

+7

, давая 'int' имя переменной' lock', не делает ее реальной блокировкой. – Dabo

ответ

3

условия гонки происходят, если есть еще более чем один поток исполнения в процессе, и все они, как правило (есть доступ) работать (чтение/изменение) общей переменной.

В вашем случае есть только нить в исполнении - main, хотя char *string объявляется global.Hence нет условия гонки.

Чтобы увидеть условия гонки в действиях, создайте темы, используя pthread. В функции потока доступ/изменение общих переменных случайным образом (строка `char * в вашем примере). Распечатайте значения во время выполнения. Вы увидите влияние.

Примечание: в вашем примере для char *string не выделена память. Выполнение strlen неверно.

+0

я вижу, а что, если эта программа я запускаю с двумя потоками? –