0 / 0 / 0
Регистрация: 18.08.2013
Сообщений: 71
1

Пул потоков с семафорами

25.12.2014, 02:31. Показов 1413. Ответов 1
Метки нет (Все метки)

Задача:написать свой пуль потоков
Написал вот такой код
C++ (Qt)
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
#include <windows.h>
#include "Worker.h"
#include<list>
 
 
class Pool{
public:
    Pool(int maxThreadsize);
    int start();
    bool ScheduleTask(Worker* task);
private:
    static DWORD WINAPI ThreadProc( LPVOID );
 
    HANDLE ghSemaphore;
 
    HANDLE getSemaphore()
    {
        return ghSemaphore;
    }
 
    bool hasTask()
    {
        return ThreadCount != 0;
    }
 
    Worker* getTask()
    {
         Worker* currentTask = mTasks.front();
         mTasks.pop_front();
         return currentTask;
    }
 
    void setFree(DWORD item)
    {
        for(int i=0 ;i<maxThreadCount;++i)
            if(dwThreadIdArray[i] == item)
            {
                isEmptyThread_[i] = 1;
                ThreadCount--;
                return;
            }
    }
 
 
    int ThreadCount;
    int maxThreadCount;
    std::list<Worker*> mTasks;
    HANDLE* aThread;
    DWORD*   dwThreadIdArray;
 
    int* isEmptyThread_; //bitmask for empty thread
};
C++ (Qt)
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "Pool.h"
#include <stdio.h>
 
Pool::Pool(int size)
{
    ThreadCount=0;
    maxThreadCount=size;
    // Create worker threads
 
    aThread=new HANDLE[maxThreadCount];
    isEmptyThread_ = new int[maxThreadCount];
    dwThreadIdArray = new DWORD[maxThreadCount];
 
    for(int i=0; i < maxThreadCount; i++ )
    {
        aThread[i] = CreateThread( 
                     NULL,       // default security attributes
                     0,          // default stack size
                     (LPTHREAD_START_ROUTINE) ThreadProc, 
                     (void*) this,       // no thread function arguments
                     CREATE_SUSPENDED,          // default creation flags
                     &dwThreadIdArray[i]); // receive thread identifier
 
        if( aThread[i] == NULL )
        {
            printf("CreateThread error: %d\n", GetLastError());
            return;
        }
        isEmptyThread_[i]=1;
    }
 
    ghSemaphore = CreateSemaphore( 
        NULL,           
        maxThreadCount,  
        maxThreadCount,  
        NULL); 
 
    if (ghSemaphore == NULL) 
    {
        wprintf(L"CreateSemaphore error: %d\n", GetLastError());
        return;
    }
}
 
int Pool::start()
{
    DWORD dwWaitResult; 
    BOOL bContinue=TRUE;
 
    while(bContinue || ThreadCount != 0)
    {
        // Try to enter the semaphore
 
        dwWaitResult = WaitForSingleObject( 
            ghSemaphore,  
            0L);           
 
        switch (dwWaitResult) 
        { 
            // The semaphore object was signaled.
            case WAIT_OBJECT_0: 
   
                bContinue=FALSE;            
 
                if(hasTask() == true)
                {
                    for(int i=0 ;i<maxThreadCount;++i)
                        if(isEmptyThread_[i] == 1)
                        {
                            isEmptyThread_[i] = 0;
                            ResumeThread(aThread[i]);
                            break;
                        }
                }
 
               break; 
            case WAIT_TIMEOUT: 
                break; 
        }
    }
    return TRUE;
 
    // Wait for all threads to terminate
 
    WaitForMultipleObjects(ThreadCount, aThread, TRUE, INFINITE);
 
    // Close thread and semaphore 
 
    for(int  i=0; i < ThreadCount; i++ )
        CloseHandle(aThread[i]);
 
    CloseHandle(ghSemaphore);
 
    return 0;
}
 
DWORD WINAPI Pool::ThreadProc( LPVOID lpParam )
{
  
    Pool* referenceToPool = (Pool*)lpParam;
 
    HANDLE ghSemaphore=referenceToPool->getSemaphore();
 
    if(referenceToPool->hasTask() == true)
    {
        Worker* currentTask=referenceToPool->getTask();
        currentTask->Execute();
    }
 
    referenceToPool->setFree(GetCurrentThreadId());
 
     // Release the semaphore when task is finished
 
       if (!ReleaseSemaphore(ghSemaphore,1,NULL) )  
       {
           printf("ReleaseSemaphore error: %d\n", GetLastError());
       }
 
    //HANDLE hThread = OpenThread(THREAD_ALL_ACCESS|THREAD_SUSPEND_RESUME, FALSE, GetCurrentThreadId());
    //SuspendThread(hThread);
     
    return TRUE;
}
 
bool Pool::ScheduleTask(Worker* task)
{
    mTasks.push_back(task); 
    ThreadCount++;
    return true;
}
Pool threadpool(2);

myworker tasks[4];

при таких значениях корректно не работает, делает первые две задачи о потом висит и ждет чего то . думаю не правильно использовал семафор, но не знаю где и почему
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2014, 02:31
Ответы с готовыми решениями:

Есть ли в C++ пул потоков
Перерыл много ссылок и не мог найти есть ли в с++ пул потоков,все источники указывают на с#...

Пул потоков на основе boost::lockfree::queue
В книге &quot;Энтони Уильямс - Параллельное программирование на С++ в действии&quot; обсуждается пул потоков...

Реализовать пул потоков, в который можно помещать функцию
не могу реализовать как в книге главу 9 пул потоков который,в который можно помещать функцию что бы...

Написать программу с семафорами которая входит в критическую секцию
На дом задали такую домашку &quot;написать программу с семафорами которая входит в критическую секцию&quot;....

1
2 / 2 / 2
Регистрация: 01.06.2014
Сообщений: 92
23.05.2016, 11:13 2
Цитата Сообщение от Vardanito Посмотреть сообщение
но не знаю где и почему
разобрался в чем причина?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2016, 11:13
Помогаю со студенческими работами здесь

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом...

как создать динамический пул максимально возможного размера?
для создания динамического пула пользуемся функцией HeapCreate(), но что указать в качестве...

Статический пул для класса с помошью class::operator new непонятное исключение?
Привет всем! Пытаюсь организовать статический пул(молниеносный аллокатор памяти. ) для некоторого...

Пул потоков
Здравствуйте. Допустим, у нас есть массив из 1000 элементов и n потоков, которые должны обработать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru