Моята c програма е многопоточна по подразбиране или stdout пренарежда моите отчети за печат?

Сблъсквам се със странен проблем. Написах проста c програма (два изходни файла, съответните секции показани по-долу). Когато стартирам програмата (a.c има основната функция), получавам изхода (тъй като броят пъти, в които извиквам „процес“, е голям, отпечатвам последните няколко разпечатки от изхода на екрана):

ключ: 'Q'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
1
ключ: 'A'
ключ: 'A'
ключ: 'C'
Грешка в сегментирането (ядрото е изхвърлено)

a.c

void process(int* hash, char* input, int number_of_ac) {
int value, i = 0;
for(; i ‹ number_of_ac; i++) {
value = get_value(hash, input[i) ]);
printf("1\n");
инкрементна_стойност(хеш, вход[i]);
}
}

b.c

int get_value(int* hash, char key) {
printf("key: '%c'\n", key);
return hash[get_index(key)];
}
< br>

void increment_value(int* hash, char key) {
int value = get_value(hash, key);
hash[get_index(key)] = ++value;
}

Въпросът ми конкретно е (крайната цел е да се опитам да отстраня грешки защо получавам грешка при сегментиране при голям брой извиквания на „процес“, а не при по-малък брой повиквания), не трябва ли да виждам разпечатка като това:

ключ: 'Q'
1
ключ: 'A'
1
ключ: 'A'
1
ключ: 'A'
и т.н.
< br>

Защо виждам отпечатък от две букви, преди отново да видя 1? Това проблем с пренареждане на буфера ли е при отпечатването на моите отчети на екрана? Или по някакъв начин моята c програма е многопоточна зад сцената?

Между другото, точно същата програма работи на моя лаптоп с МНОГО ПО-ГОЛЯМ набор от входни данни:

Linux ubuntu 3.8.0-25-generic #37-Ubuntu SMP четвъртък, 6 юни 20:47:07 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Но той прекъсва с грешката на сегментирането по-горе при много по-малък вход на друга машина:

Linux x.y.z 2.6.32-279.19.1.el6.cny6.7068.x86_64 #1 SMP Mon Mar 11 08:59:43 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux

Някакви идеи? Оценявам помощта ви!


person user2589308    schedule 16.07.2013    source източник
comment
Компилаторът няма да обработва тайно многонишковия ви код. Seg-fault е ясен индикатор, че някъде имате недефинирано поведение. Вероятно някъде препълвате буфер, но тук няма достатъчно информация; Предлагам да се създаде минимален тестов случай.   -  person Oliver Charlesworth    schedule 17.07.2013
comment
Тъй като increment_value извиква get_value и вие извиквате всеки от тях всеки път през вашия цикъл, не бих очаквал да видя резултатите, които очаквате да видите. Бих очаквал да видя нещо по-близко до това, което всъщност виждате. printf на ключа ще се появи два пъти за всяка итерация на цикъл, а printf на 1 само веднъж.   -  person lurker    schedule 17.07.2013


Отговори (1)


Вижте как наричате стойност на нарастване:

void increment_value(int* hash, char key) {
   int value = get_value(hash, key); // calling get_value
   hash[get_index(key)] = ++value;
}

така че отпечатвате char тук и извиквате get_value отново във функцията на процеса. Ето защо получавате множество разпечатки на знаци преди "1"

person Amadeus    schedule 16.07.2013
comment
Грешката е моя. Трябваше да видя това обаждане. Прекарах по-голямата част от времето си в извличане на подходящ код и мислене за грешката на seg, че не забелязах собствената си функция да извиква get_value два пъти преди отпечатването на 1. - person user2589308; 17.07.2013