singlepost

многопоточность, как правильно? C++ << На главную или назад  

здравствуйте. такие дела:
пытаюсь считать текст из файла пословно и добавить каждое слово в <map>
<map> определил глобально, файл тоже определен глобально.

функция чтения такая:

UINT reading_th1(LPVOID pParam){

string str;

while (!mfile.eof()){
mfile &gt;&gt; str;
mymap[str]+=1;
}

return 0;
}

из мейна вызываю 4 потока

AfxBeginThread(reading_th1,NULL);
AfxBeginThread(reading_th1,NULL);
AfxBeginThread(reading_th1,NULL);
AfxBeginThread(reading_th1,NULL);

итог 3 состояния:
работает (при этом снижает общее время выполнения программы на несколько секунд, что и требуется)
зависает
ошибка

причем выскакивают рандомно, как понимаю это результат когда потоки одновременно пытаются прочитать файл.

готов слушать ваши ругательста и угрозы побить по рукам, но дайте ссылки или сами напишите примеры и теорию как это использовать ПРАВИЛЬНО. сегодня первый день пытаюсь сам прикрутить потоки к своей программе. а в учебнике вузовском нету )

28 ответов в теме “многопоточность, как правильно? C++”

Страницы: [1] 2 3 »

  1. 1
    Константин Смотритель ответил:

    Медведь, как бы сказать помягче… лучше наводящий вопрос: а какой тип возвращает твоя AfxBeginThread()? Вот, и при чём здесь системный хендл потока?

    А ещё учись пользоваться функцией GetLastError() и утилитой ErrorLookup!

    P.S.Нормальный Win32 пример тут http://www.gamedev.net/community/forums/topic.asp?to...

    а тебе надо заюзать это (скопируй ссылку в браузер) http://msdn.microsoft.com/en-US/library/afb2xh7f(v=VS.80).aspx

  2. 2
    Евгений Князев ответил:

    открыть для себя семафоры (или замки — частный случай семафора).
    обращаешься к ресурсу (файлу) — закрываешь семафор. Другой поток будет ждать разрешения поработать с ресурсом.
    закончил работать с ресурсом — открыл семафор.

    А тут у тебя ситуация на грани аппаратного deadlock — в один момент времени только один поток имеет право обладать ресурсом.

  3. 3
    Пашка Джиоев ответил:

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

  4. 4
    ответил:

    спасибо. инфу нашел. сейчас попробую.

    еще небольшой вопрос:
    можно ли миногопоточно перевести данные из <map> в <multimap> ?
    как реализовать алгоритм? я что то думал, не знаю.

  5. 5
    ответил:

    2Пашка ت Джиоев
    при иногда верной работе программы (без семафоров, щас я их напишу попытаюсь), я получаю прирост 3-4 секунды. что очень для меня хорошо.

  6. 6
    Дмитрий Ашкадов ответил:

    Работа с диском ой какая тормозная, какой тут может быть прирост, кроме константы? а константный прирост – фигня ненужная

  7. 7
    Сыроватченко Сергей ответил:

    почитай шилда, у него неплохо написана о реализации многопоточности.

  8. 8
    ответил:

    можно ссылочку пожалуйста?

  9. 9
    Пашка Джиоев ответил:

    Какой длины строки?
    Если небольшие, то я не понимаю откуда прирос может бытью

  10. 10
    ответил:

    первый том войны и мира – 3мегабайта )

Страницы: [1] 2 3 »

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.