Qraizer

Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору xdude Цитата: ...Синхронизацию я и без того использую. У меня есть тред, который ждет изменения этого вектора в некотором цикле и время от времени его проверяет. Сам цикл очеь которткий: проверка длины вектора и слип на несколько секунд. | Не совсем правильно используешь, значит. Попробуй добавить критическую секцию к std::vector<>size(). Впрочем, читай дальше. Цитата: Естественно, изменения вектора в самом этом цикле не происходит, и оптимизатор решает, что каждый раз вытаскивать длину вектора из памяти неэффективно, и поэтому один раз помещает эту переменную в регистр перед входом в цикл, и дальше, естественно, зависает в бесконечном ожидании того, чего случиться никогда не может, так как регистр этот в данном контексте выполнения никем и никогда не поменяется. | Давай угадаю - ты Билдер юзаешь. Впрочем, у предыдущих Intel C++ компиляторов тоже наблюдался подобный глюк оптимизации. Скажу сразу: оптимизатор не прав, выполняя такую оптимизацию. В стандарте чёрным по белому записано: все побочные эффекты, вызванные оптимизацией, обязаны быть нейтрализованы к моменту получения функцией управления. То же относится и к возврату из функции в точку вызова. Т.е. стандарт защищает программиста от таких агрессивных оптимизаторов, позволяя ему всегда рассматривать функции как нечто неделимое. Цитата: ...Модификатор volatile именно для таких случаев и придуман, так что RTFM. | Это-то верно (хоть и только отчасти, но не суть), но используя volatile, ты согласаешься с неоптимизацей вектора всего и везде. Ой-ёй-ёй. Я бы сказал, что это очень плохое согласие. Попробуй напиши простой код с вектором и замерь производительность с полной оптимизацией и полным её отсутствием. Разница будет в десятки раз, уж поверь. Теперь по сути. Вот такой код у меня Код: #include <windows.h> #include <process.h> #include <conio.h> #include <cstdlib> #include <vector> #include <string> #include <sstream> #include <iostream> std::vector<std::string> v; HANDLE evExit; unsigned __stdcall thread(void*) { while(v.size() < 400000) Sleep(1000); while(WaitForSingleObject(evExit, 1000) == WAIT_TIMEOUT) std::cout << v.size() << '\t'; std::cout << std::endl; return 0; } int main() { evExit = CreateEvent(NULL, TRUE, FALSE, NULL); unsigned threadID; HANDLE hThread=reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, thread, NULL, 0, &threadID)); while(!kbhit() || getch()!='\x1B') v.push_back(static_cast<std::ostringstream&>(std::ostringstream() << rand()).str()); SetEvent(evExit); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); CloseHandle(evExit); } | и VC2003, и Intel C++ 9.1 отлично компилится и правильно оптимизируется. Сравни со своим и качественные отличия запости сюда, если потенция поразбираться ещё не кончилась. | Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 19:25 21-04-2007 | Исправлено: Qraizer, 19:27 21-04-2007 |
|