Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: WinAPI


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1130
∙ повысить рейтинг »
Калеев Владимир Викторович
Статус: 6-й класс
Рейтинг: 276
∙ повысить рейтинг »
amnick
Статус: 4-й класс
Рейтинг: 140
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / WinAPI

Номер выпуска:573
Дата выхода:28.10.2009, 22:30
Администратор рассылки:Лысков Игорь Витальевич, Модератор
Подписчиков / экспертов:465 / 96
Вопросов / ответов:1 / 1

Вопрос № 173619: Здравствуйте!Помогите,пожалуйста,разобраться со следующим вопросом: Есть задача по синхронизации потоков. Есть некоторое число потоков(>3).Нужно,чтобы каждый поток запускался и выводил на консоль сообщение ,что он запустился,потом этот поток...



Вопрос № 173619:

Здравствуйте!Помогите,пожалуйста,разобраться со следующим вопросом:
Есть задача по синхронизации потоков.
Есть некоторое число потоков(>3).Нужно,чтобы каждый поток запускался и выводил на консоль сообщение ,что он запустился,потом этот поток спит несколько секунд (с помощью функции Sleep) и выводит на консоль сообщение, что он завершился.Сообщения должны выводиться в хаотичном порядке.Например:
поток 1 запустился
поток 3 запустился
поток 1 завершился
поток 2 запустился и т.д. в цикле.
Синхронизацию осуществляю с помощью CRITICAL SECTION .Проблема именно в хаотичности.(os windows xp,среда builder c++6)
Помогите новичку!пробная версия в приложении!

Отправлен: 23.10.2009, 23:22
Вопрос задал: РАИ, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает amnick, 4-й класс :
Здравствуйте, РАИ.
Как я вижу, Вы переделали мою программу. Парочка замечаний.

- если несколько потоков должны выполнять одинаковую работу, совершенно незачем для каждого из них делать отдельную функцию. Можно обойтись одной функцией, передавая ей разные параметры. Сохраняйте нужные данные локально (в стеке) или выделяйте память для потока (Thread Local Storage). См. описания (TlsAlloc,TlsGetValue,TlsSetValue,TlsFree). В данном случае достаточно сохранить номер потока в локальной переменной. Написание отдельных одинаковых функций для каждого потока свидетельствует о непонимании того, как работают потоки.

- в вашем варианте есть серьезная (с моей точки зрения) ошибка. Вы пишете:

EnterCriticalSection(&cs);
cout<<"thread#1 started"<<GetCurrentThreadId()<<endl;
Sleep(500);
cout<<"thread#1 finished"<<GetCurrentThread()<<endl;
LeaveCriticalSection(&cs);

При этом выполнение оч ередного потока начнется только после завершения предыдущего.
Нужно синхронизировать только вывод на консоль:

EnterCriticalSection(&cs);
cout<<"thread#1 started"<<GetCurrentThreadId()<<endl;
LeaveCriticalSection(&cs);

Sleep(500);

EnterCriticalSection(&cs);
cout<<"thread#1 finished"<<GetCurrentThread()<<endl;
LeaveCriticalSection(&cs);

- директива #define WIN32_LEAN_AND_MEAN должна быть ПЕРЕД #include<windows.h>, иначе она не имеет смысла.

Переработанный вариант программы — в приложении. Директивы #pragma, специфические для Borland C++ Builder, я закомментировал. Проверял с MSVC 6.0.

Потоки запускаются и завершаются в случайном порядке. Для запуска генерируется случайный номер и проверяется, не запущен ли уже поток с данным номером. Если нет, то поток создается. Внутри каждого потока генерируется случайная задержка, поэтому и завершаются потоки в слу чайном порядке. Пример выполнения:

thread 4 started 9604
thread 1 started 8396
thread 3 started 8816
thread 2 started 8300
thread 3 finished 8816
thread 1 finished 8396
thread 4 finished 9604
thread 2 finished 8300

All threads finished. Press any key to exit.

Успехов!

P.S. Если будут вопросы, то ответить смогу только в понедельник после 13-14 часов.

Приложение:

Ответ отправил: amnick, 4-й класс
Ответ отправлен: 24.10.2009, 00:31

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255775 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.10 от 26.10.2009

    В избранное