Консультация № 172468
22.09.2009, 12:15
0.00 руб.
0 6 1
Здравствуйте!Помогите,пожалуйста,по задаче:
Написать многопотоковое приложение используя стандартную функцию Thread(2 потока,каждый из которых выводит на консоль свой номер) Заранее спасибо!

Обсуждение

Неизвестный
22.09.2009, 20:35
общий
это ответ
Здравствуйте, РЫЖОВА АЛИНА ИГОРЕВНА.

более подробно формулируйте задание, пожалуйста
не совсем понятно о какой стандартной функции Thread идет речь
и что за номер должен выводить процесс
указывайте операционную систему и среду разработки

в приложении простая программа для Windows
создаются 2 процесса
каждый из них выводит свой идентификатор

Приложение:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI Thread_1(LPVOID p)
{
cout << "thread #1 id: " << GetCurrentThreadId() << endl;

return 0;
}

DWORD WINAPI Thread_2(LPVOID p)
{
cout << "thread #2 id: " << GetCurrentThreadId() << endl;

return 0;
}

int main()
{
HANDLE hThread_1, hThread_2;
DWORD IDThread_1, IDThread_2;

// запускаем поток 1
hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, &IDThread_1);
if (hThread_1 == NULL)
return GetLastError();

// запускаем поток 2
hThread_2 = CreateThread(NULL, 0, Thread_2, NULL, 0, &IDThread_2);
if (hThread_2 == NULL)
return GetLastError();

// ждем, пока поток Thread_1 закончит работу
WaitForSingleObject(hThread_1, INFINITE);
// ждем, пока поток Thread_2 закончит работу
WaitForSingleObject(hThread_2, INFINITE);

// закрываем дескриптор потока Thread_1
CloseHandle(hThread_1);
// закрываем дескриптор потока Thread_2
CloseHandle(hThread_2);

return 0;
}
Неизвестный
22.09.2009, 21:35
общий
Спасибо,что откликнулись!Извините,что сразу не сказала:
Функция CreateThread;
Операционная система windows xp
среда разработки С++ Builder 6;

Подскажите,что исправить,если после компиляции программы консольное окно появляется и сразу изчезает,не выводя ничего .
Неизвестный
22.09.2009, 21:57
общий
вывод в окно есть
только вы не успеваете заметить
добавьте в конец программы ввод любого значения с клавиатуры
чтобы программа перешла в режим ожидания и вы успели налюбоваться значениями идентификаторов
Неизвестный
22.09.2009, 22:01
общий
Добавьте
#include <conio.h>
и в конце функции main,перед return
getch();
Неизвестный
23.09.2009, 19:21
общий
Подскажите,пожалуйста!Вывод в окно не понятный,что-то вроде "tthhrreeaadd# 1#2i di:d3:1 220076"
Каждый раз не ясно,где чей идентификатор.
Неизвестный
26.09.2009, 12:07
общий
РЫЖОВА АЛИНА ИГОРЕВНА:
Естественно. Потоки ведь выполняются одновременно, записывая данные в общий ресурс (поток вывода).
Чтобы избежать этого, нужно синхронизировать доступ к ресурсу при помощи критической секции или мьютекса:
Код:
#include <windows.h>
#include <iostream.h>

CRITICAL_SECTION cs;

DWORD WINAPI Thread_1(LPVOID p)
{
// входим в критическую секцию и получаем эксклюзивный доступ к охраняемому ресурсу
EnterCriticalSection(&cs);
// пишем данные в поток вывода
cout << "thread #1 id: " << GetCurrentThreadId() << endl;
// покидаем критическую секцию
LeaveCriticalSection(&cs);

return 0;
}

DWORD WINAPI Thread_2(LPVOID p)
{
// входим в критическую секцию и получаем эксклюзивный доступ к охраняемому ресурсу
EnterCriticalSection(&cs);
// пишем данные в поток вывода
cout << "thread #2 id: " << GetCurrentThreadId() << endl;
// покидаем критическую секцию
LeaveCriticalSection(&cs);

return 0;
}

int main()
{
HANDLE hThread_1, hThread_2;

// создаем критическую секцию
InitializeCriticalSection(&cs);

// запускаем поток 1
hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL);
if (hThread_1 == NULL)
return GetLastError();

// запускаем поток 2
hThread_2 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL);
if (hThread_2 == NULL)
return GetLastError();

// ждем, пока поток Thread_1 закончит работу
WaitForSingleObject(hThread_1, INFINITE);
// ждем, пока поток Thread_2 закончит работу
WaitForSingleObject(hThread_2, INFINITE);

// закрываем дескриптор потока Thread_1
CloseHandle(hThread_1);
// закрываем дескриптор потока Thread_2
CloseHandle(hThread_2);

// удаляем критическую секцию
DeleteCriticalSection(&cs);

return 0;
}
Форма ответа