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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2012, 18:05   #1
rostik123
Пользователь
 
Регистрация: 19.10.2011
Сообщений: 51
Вопрос Сортировка массива методом пузырька в несколько потоков

Как ето зделать c помощью WinApi .
Программа может работать и не всегда корректно, мне главное чтобы посмотреть как это происходит ...

Последний раз редактировалось rostik123; 11.10.2012 в 18:08.
rostik123 вне форума Ответить с цитированием
Старый 11.10.2012, 22:39   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Примерно так
Код:
#include <stdio.h>
#include <windows.h>

HANDLE hThread1;
const int n=10;
int a[n], i, j;//всё глобальное, потому что лень

DWORD WINAPI Thread2( void* pParams )//поток для обмена
{
    int tmp=a[i];
    a[i]=a[j];
    a[j]=tmp;
    Sleep(50);//для наглядности
}

DWORD WINAPI Thread1( void* pParams )//поток сортировки
{
    for (i=0;i<n-1;i++)
    for (j=i+1;j<n;j++)
    if (a[i]>a[j])
    {
        HANDLE hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);//запускаем обмен в отдельном потоке
        WaitForSingleObject(hThread2,INFINITE);//и ждем окончания этого потока
        //если убрать, то сортировка будет неправильной
        CloseHandle(hThread2);
    }
}

int main()
{
    for (i=0; i<n; i++) {a[i]=rand()%10; printf("%d ", a[i]); }; printf("\n");

    hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);//запускаем сортировку
    WaitForSingleObject(hThread1,INFINITE);//ждём окончания

    for (i=0; i<n; i++) printf("%d ", a[i]);
}
Более подробно с передачей параметров в потоки http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
eoln вне форума Ответить с цитированием
Старый 12.10.2012, 14:30   #3
rostik123
Пользователь
 
Регистрация: 19.10.2011
Сообщений: 51
По умолчанию

спасибо, важна для меня информация, буду разбираться с ней ...
rostik123 вне форума Ответить с цитированием
Старый 12.10.2012, 20:26   #4
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Цитата:
Примерно так
А ха ха. Ну формально ты прав.

Но ппц. Да, так быстрее чем одним потоком )))))))))))
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 12.10.2012, 22:39   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от LynXzp Посмотреть сообщение
Но ппц. Да, так быстрее чем одним потоком )))))))))))
Ну дык человеку ведь надо именно в несколько потоков, ИМХО это не реальная задача, а учебная.
eoln вне форума Ответить с цитированием
Старый 12.10.2012, 22:55   #6
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

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

Цитата:
Программа может работать и не всегда корректно, мне главное чтобы посмотреть как это происходит ...
Может так?
Код:
#include <stdio.h>
#include <windows.h>

HANDLE hThread1;
const int n=10;
int a[n], i, j;//всё глобальное, потому что лень

DWORD WINAPI Thread1( void* pParams )//поток сортировки
{
    for (i=0;i<n-1;i++)
    for (j=i+1;j<n;j++)
    if (a[i]>a[j])
    {    int tmp=a[i];
         a[i]=a[j];
         a[j]=tmp;
    }
}

DWORD WINAPI Thread2( void* pParams )//поток сортировки
{
    for (i=n-1;i>0;i--)
    for (j=n;j>i+1;j--)
    if (a[i]<a[j])
    {    int tmp=a[i];
         a[i]=a[j];
         a[j]=tmp;
    }
}

int main()
{
    for (i=0; i<n; i++) {a[i]=rand()%10; printf("%d ", a[i]); }; printf("\n");

        HANDLE hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
        HANDLE hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
        WaitForSingleObject(hThread1,INFINITE);
        WaitForSingleObject(hThread2,INFINITE);
        CloseHandle(hThread1);
        CloseHandle(hThread2);

    for (i=0; i<n; i++) printf("%d ", a[i]);
}
Не копмилил даже, и не уверен что сработает, но главное суть - сортировка пузырьком в 2 стороны сразу, никакого контроля, никаких синхронизаций =))
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 13.10.2012, 00:13   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Ну если некорректно, то да )))
Что-то не идёт на ум способ без остановок потоков. С синхронизацией так
Код:
#include <stdio.h>
#include <windows.h>

HANDLE hEvent1, hEvent2;

const int n=100;
int a[n];

DWORD WINAPI Thread1( void* pParams )//поток сортировки
{
    for (int i=0;i<n-1;i++)
    for (int j=i+1;j<n;j++){
        WaitForSingleObject(hEvent1, 100);
        if (a[i]>a[j])
        {    int tmp=a[i];
             a[i]=a[j];
             a[j]=tmp;
        }
        ResetEvent(hEvent1);
        SetEvent(hEvent2);
    }
}

DWORD WINAPI Thread2( void* pParams )//поток сортировки
{
    for (int i=n-2;i>=0;i--)
    for (int j=n-1;j>=i+1;j--){
        WaitForSingleObject(hEvent2, 100);
        if (a[i]>a[j])
        {    int tmp=a[i];
             a[i]=a[j];
             a[j]=tmp;
        }
        ResetEvent(hEvent2);
        SetEvent(hEvent1);
    }
}

int main()
{
    for (int i=0; i<n; i++) {a[i]=rand()%10; printf("%d ", a[i]); }; printf("\n");

        hEvent1 = CreateEvent( NULL, false, true, NULL );
        hEvent2 = CreateEvent( NULL, false, false, NULL );
        HANDLE hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);
        HANDLE hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
        WaitForSingleObject(hThread1,INFINITE);
        WaitForSingleObject(hThread2,INFINITE);
        CloseHandle(hThread1);
        CloseHandle(hThread2);
        CloseHandle(hEvent1);
        CloseHandle(hEvent2);

    for (int i=0; i<n; i++) printf("%d ", a[i]);
}
вроде как параллельно работают, но шаги по очереди делают. Но ведь в одном ядре многозадачности тоже вроде как бы и нет и как бы и есть

[UPD]
Что-то тупанул )) Надо было вместо событий критическую секцию (аля ей подобное) ставить, тогда бы потоки немного соревновались

Последний раз редактировалось eoln; 13.10.2012 в 00:23.
eoln вне форума Ответить с цитированием
Старый 13.10.2012, 12:09   #8
rostik123
Пользователь
 
Регистрация: 19.10.2011
Сообщений: 51
По умолчанию

спасибо, буду разбираться с вашими примерами и на основе их делать свои программы в целях обучения ...
rostik123 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива методом "пузырька" Loreena.J Помощь студентам 3 11.10.2012 13:53
Сортировка массива методом пузырька SashaBogush Помощь студентам 0 11.08.2012 15:08
Сортировка массива методом пузырька bonjovi Паскаль, Turbo Pascal, PascalABC.NET 8 30.01.2012 20:23
VBA. Сортировка массива методом пузырька divine_excuse Помощь студентам 1 29.12.2011 00:05
Сортировка методом пузырька fygas1991 Общие вопросы C/C++ 5 15.11.2009 21:39