Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2009, 21:53   #1
MaxDDT
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 10
По умолчанию Как в VS 2008 создать поток?

Здравствуйте!
Решаю простую задачу.

IDE - Visual Studio 2008 C++
OS - Windows XP

Я в С++ новичёк, вот разбираюсь с потоками.
В общем "концепция" ясна. Поток - это такая штука с помощью которой можно распараллеливать задачи. То есть, если в компьютере есть 2 и больше ядер или процессоров, то можно их нагрузить, что бы они работали параллельно, и соответственно ускорить выполнение программы.

Проблема состоит в следующем, никак не могу понять как выглядит алгоритм распараллеливания. Знаю что есть функция createThread, так же знаю что её не рекомендуется использовать если в коде используются стандартные функции библиотеки С, такие как например printf() или strcmp(). Проблема в том что функции стандартной библиотеки С не предназначены для использования в Win32 АРІ, и для того чтобы создать поток необходимо во время создания и завершения потока выполнять некоторые действия, все эти действия уже включены в функцию _beginthreadex() для создания потока и _endthreadex() – для завершения потока. эти функции описаны в ргосеss.h

Вот я пришел к тому что мне нужна функция _beginthreadex(). Читал MSDN. Есть примеры программ с использованием потоков.

Программа находит сумму ветора чисел, который состоит не более чем из 8-ми элементов при помощи потоков. Ми имеем массив а[], и ячейки памяти mem.

Код:
#include <windows.h>
#include <process.h>
#include <iostream>
#include <conio.h>
using namespace std;

int number1 = 9,number2 = 1,numb=0;
int proc1,proc2,k=0,mem[10];
unsigned tid;
HANDLE Thread[8];
DWORD res;
int i,p=2,A,B,a[8];

unsigned __stdcall Sum( void * arg)   // Функция потока
{
        proc1=a[k];
        proc2=a[k+1];
        mem[k]=proc1+proc2;
        cout<<"Ячейка памяти[ "<<i<<" ]"<<mem[k]<<endl;
        k+=2;
	return 0;

};
unsigned __stdcall Sum2( void * arg)   // Функция потока
{
        proc1=mem[k];
        proc2=mem[k+p];
        mem[k]=proc1+proc2;
        cout<<"Ячейка памяти[ "<<i<<" ]"<<mem[k]<<endl;
        k+=4;
	return 0;

};

int main()
{       SetConsoleOutputCP(1251);
        cout<<"Введите количество чисел (до восьми)\n";
        cin>>A;
        cout<<"Введите числа\n";
        for (i=0;i<8;i++){
        a[i]=0;
        }
        for (i=0;i<A;i++){
        cin>>a[i];
        }

        for (i=0;i<4;i++){
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, Sum, 0, 0, &tid);
        Sleep(10);
        }
        // Ждём, пока потоки не завершит свою работу
	WaitForMultipleObjects(4, Thread, TRUE, INFINITE );
        cout<<"Потоки завершили работу"<<endl;
        for (i=0;i<8;i++){
        CloseHandle(Thread[i]);
        }
        k=0;
        for (i=0;i<2;i++){
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, Sum2, 0, 0, &tid);
        Sleep(10);
        }
       // Ждём, пока потоки не завершит свою работу
	WaitForMultipleObjects(2, Thread, TRUE, INFINITE );
        cout<<"Потоки завершили работу"<<endl;
        for (i=0;i<2;i++){
        CloseHandle(Thread[i]);
        }
        //for (i=0;i<10;i++)cout<<mem[i]<<endl;
        p=4;k=0;i=0;
        Thread[1] = (HANDLE)_beginthreadex(NULL, 0, Sum2, 0, 0, &tid);
        Sleep(10);
        cout<<"Потоки завершили работу"<<endl;
        CloseHandle(Thread[1]);

        getch();
	return 0;
}
Но не как не могу понять некоторых вещей:

1. HANDLE Thread[8]; - Что такое HANDLE? Это тип данных или что? Thread[8] - это я так понимаю массив из 8 элементов типа HANDLE?
2. DWORD res; - что это такое?
3. Thread[i] = (HANDLE)_beginthreadex(NULL, 0, Sum, 0, 0, &tid); Sleep(10); Как понять эту строчку?
4. WaitForMultipleObjects(4, Thread, TRUE, INFINITE ); Как понять эту строчку?

Заранее благодарен за понимание, я новенький в этом деле, поэтому с чтением документации возникают проблемы. Нужна определённая база, чтобы понимать всё.
Поправьте если что не так говорю. Заранее благодарен!!!

Последний раз редактировалось MaxDDT; 11.12.2009 в 21:57.
MaxDDT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отменить поток RIO Общие вопросы Delphi 11 12.10.2009 00:29
Visual Studio 2008 Создать RichEdit nusik Общие вопросы C/C++ 0 29.05.2009 08:31
Создать RSS поток с помощью Web Service damned20 PHP 1 22.05.2009 13:39
Как правильно завершить поток Des Общие вопросы Delphi 5 08.05.2009 20:56
Как остановить поток? Никки Win Api 3 06.12.2007 22:04