Форум программистов, компьютерный форум CyberForum.ru

Распараллеливание потоков - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ определить принадлежность точки треугольнику http://www.cyberforum.ru/cpp-beginners/thread261949.html
определить принадлежит ли точка, заданная координатам, треугольнику, который задан координатами вершин. КАК задать треугольник? и как потом определить принадлежит (не принадлежит) точка которую мы задаем для нашего треугольника? визначити чи належить точкаБзадана координатам,трикутнику,який заданий координатами вершин.ЯК задати трикутник? і як потім визначити чи належить(не належить) точка яку...
C++ Вывести в новый файл информацию о той продукции, количество которой менее заданной величины. Решить задачу, используя структуру содержащую члены-данные и члены-функции. Подразумевается, что исходная информация храниться в текстовом файле input.txt, каждая строка которого содержит полную информацию о некотором объекте, результирующая информация должна быть записана в файл output.txt На основе данных входного файла составить инвентарную ведомость склада, включив следющие данные: вид... http://www.cyberforum.ru/cpp-beginners/thread261945.html
Быстрая сортировка: упорядочить нечетные элементы матрицы по возрастанию C++
Задача: упорядочить нечетные элементы двумерного массива по возрастанию с помощью quicksort. Также нужно, чтобы программа подсчитала количество сравнений и перестановок и вывела это отдельно. Массив задается отдельной функцией, отсортированный печатается тоже отдельно (это сделано все). Главная проблема с подсчетом (не знаю как реализовать) и сама сортировка почему-то не до конца работает. ...
Непонятная ошибка C++
#include <iostream> #include <string> using namespace std; class CMessage { private: char *Text; char *SenderNick;
C++ Люди подскажите какой Microsoft Visual Studio 2010 вы используете? http://www.cyberforum.ru/cpp-beginners/thread261911.html
Значит проблема такая поставил Microsoft Visual Studio 2010 Express. Очень многие коды не работают. Вообще в чем проблема. Может другую версию надо поставить?
C++ Borland C Ребята помогите плиз решить простую задачку!! Найти произведение всех цифр заданого четырехзначного числа!! Заранее спасибо... подробнее

Показать сообщение отдельно
Genson
0 / 0 / 0
Регистрация: 09.03.2011
Сообщений: 6
22.03.2011, 22:53     Распараллеливание потоков
Добрый день.
У меня есть программ в которой Пузырьковая сортировка и Бинарный поиск выполняются в отдельных потоках, причём изначально они приостановленные, а уже в main'е в определённых моментах я к ним обращаюсь с помощью ResumeThread().

Нужно решить две задачи на распараллеливание.
Первая: Распараллелить пузырьковую сортировку и main, таким образом что бы на каждой итерации сортировки показывался промежуточный результат и номер итерации.

Вторая: Распараллелить бинарный поиск и main, чтобы показывался промежуточный результат ( пр. первый, середина и последний элемент, а также номер итерации).

Подскажите, пожалуйста, с чего начать.

Мои соображения: Дописать в сортировку и бинарный поиск код, который будет выводить на каждой итерации результат. В main'e ничего не менять. Но будет ли это считаться распараллеливанием своего потока и main'а ?

Код программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream> 
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <fstream>
#include <cctype> 
#include <conio.h>
#include <errno.h>
#include <process.h>
using namespace std;
#define SIZE 50
 
long mass[SIZE], mass2[SIZE];
int key, k, tmp, first, last,mid;
 
DWORD WINAPI binsearch(LPVOID lpParam) 
{
    first = 0; // Первый элемент в массиве
    last = k-1; // Последний элемент в массиве
        while ( first < last ) {
        mid = ( first + last ) / 2;
        if ( key <= mass[mid] ) {
            last = mid;
        } else {
            first = mid + 1;
        }
    }
    if ( mass[last] == key ) {
        for (int t=0; t<k-1;t++)
        {
            if (mass[last] == mass2[t]) printf("\nThe number %d is located in an array in number position: %d \n", key,t+1);
        }
    } else {
        printf("\nThe number %d is not located in an array\n", key);
    }
    return(0);
}
 
DWORD WINAPI bubleSort(LPVOID lpParam) 
{
    tmp =0;
    for (int i = 1; i<k-1; i++){
 
        for (int j=0; j<k-2; j++)
            if (mass[j]>mass[j+1]) {
                tmp = mass[j];
                mass[j] = mass[j+1];
                mass[j+1] = tmp;        
                }
    }
    return(0);
}
int main(){
 
    k=0;
    FILE * f;
    f = fopen ("e:\\test.txt" , "r");
    if (f == NULL) perror ("Error opening file");
    char buf[32], * tail;
        
    while ( fscanf(f, "%s", buf) == 1 ){
    errno = 0;
    mass[k] = strtol(buf, &tail, 10);
    mass2[k] = strtol(buf, &tail, 10);
    if ( errno || *tail ) {cout<<"V faile naxodytsy krakozybri"<<endl; return 0;}
    k++;
    }
    
    cout << "Please enter key for seach: "<< endl;
    cin >> key; // считываем со строки в int
    char key_char = (char)cin.get(); // считываем со строки в char
    // преобразование инт в чар*, потом в стринг и нахождение колличества элементов в строке для переполнения
    char * szString = new char[17];
    itoa(key,szString,10); // int -> char
    string str = (string)szString;
    if ((int)key_char != 10){cout << "a is not number! Again!" << endl; cout << "Press ENTER to finish work" << endl; getch(); return 0;}// если аски последний равен 10(аски перехода на новыю строку), то все круто
    if (str.length() ==45) {cout<< "Program uses only unsigned int" <<endl; cout << "Press ENTER to finish work" << endl; getch(); return 0;}
    if (str.length() >=10) {cout<< "Overflowing" <<endl; cout << "Press ENTER to finish work" << endl; getch(); return 0;}
   
    // Работа с потоками
 
    //Первый поток - Пузырьковая сортировка
    DWORD bubbleSort_id;
    HANDLE hThread1 = CreateThread(
    NULL,//атрибуты защиты
    0,//Размер стека
    bubleSort,//функци
    0,//параметры
    CREATE_SUSPENDED,//флаг, управляющий потоком, т.к. такой, то поток инилицизируется, но его нужно "пробудить" с помощью ResumeThread
    &bubbleSort_id);//адрес переменной, куда вернется идентификатор
 
    if(hThread1 == NULL){cout<<"Error in creating thread 1 "<<endl;}
 
    ResumeThread(hThread1);
    WaitForSingleObject(hThread1,INFINITE);
    CloseHandle(hThread1);
 
    ///Второй поток - Бинарный поиск
    DWORD binsearch_id;
    HANDLE hThread2 = CreateThread(NULL,//атрибуты защиты
    0,//Размер стека
    binsearch,//функция
    0,//инициализирующее значение 0, this, (PVOID) &название переменной
    CREATE_SUSPENDED,//флаг, управляющий потоком
    &binsearch_id);//адрес переменной, куда вернется идентификатор
    if(hThread2==NULL){cout<<"Error in creating thread 2 "<<endl;}
 
    ResumeThread(hThread2);
    WaitForSingleObject(hThread2,5);
    CloseHandle(hThread2);
    getch();
 
    return 0;
}
Добавлено через 5 часов 33 минуты
Подскажите хоть какие функции использовать и/или правильны ли мои соображения.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru