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

Использование несколькими потоками одной функции - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Оптимизация кода игры в крестики нолики. http://www.cyberforum.ru/cpp-beginners/thread946452.html
Написал небольшой код буду благодарен если нормальные программисты порекомендуют как его нужно исправить. это игра в крестики нолики 10*10. ниже привожу файлы. Board.cpp #ifndef _Board_ #define _Board_ #include <iostream> #include "board.h" #endif using namespace std;
C++ Имя экземпляра объекта внутри класса на С++ Добрый день. Подскажите, пожалуйста, как узнать имя экземпляра объекта внутри класса на С++ ? В частности, мне надо имя экземпляра объекта печатать на экран. http://www.cyberforum.ru/cpp-beginners/thread946447.html
C++ Разница между С и С++
Если не брать во внимание объекты и классы, то разница состоит только лишь в cin, cout и директивах?
C++ Рекурсивные функции
1. Написать рекурсивную функцию, которая бы вычисляла n-тое число Фибоначчи. 2. Написать рекурсивную функцию которая печатает элементы массива в обратном порядке.
C++ Принципы отладки в MVS 2012 http://www.cyberforum.ru/cpp-beginners/thread946414.html
Привет киберфорумцы! Подскажите пожалуйста, как в режиме отладки путешествовать только по написанному мной коду не, заходя в файлы предоставляемые MVS? А то начинаешь искать ошибку, выставив точку останова, для того, чтобы отследить поведение некоторых переменных внутри функции, тыкаешь Ф11 (чтобы перепрыгнуть из мейн в функцию), а забрасывает в какой-нибудь бесконечный ostream или...
C++ Присвоение значения указателю Как можно, вот так, присваивать указателю значение? Разве, указатель не должен всегда содержать адрес? const char* szString = "Randy"; подробнее

Показать сообщение отдельно
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 1
31.08.2013, 23:20     Использование несколькими потоками одной функции
А нельзя ли это все переписать в более простом стиле ?
Например (ПСЕВДОКОД) :
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
int main()
{
    control Control; // Некий класс для управления потоками.
 
    HANDLE *pThreadHandles = new HANDLE[NumThreads];
 
    // Создаем столько-то потоков и синхронно стартуем их.
 
    for (int i = 0; i < NumThreads; ++i)
    {
        pThreadHandles[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, &Control, 0, NULL);
    }
 
    Control.start();
 
    // Ждем команды пользователя и даем потокам команду "завершить".
    _getch();
    Control.stop();
 
    // Ожидание завершения.
 
    WaitForMultipleObjects(NumThreads, pThreadHandles, TRUE, INFINITE); 
 
    for (int i = 0; i < NumThreads; ++i)
    {
        CloseHandle(pThreadHandles[i]);
    }
 
    delete [] pThreadHandles;
 
    // Здесь обработка результатов.
    // ...
 
    return 0;
}


Ну а функция потока могла быть примерно такой:
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
unsigned int _stdcall ThreadProc(void *pParam)
{
    control *pCtrl = (control *)pParam;
    DWORD const ThreadId = GetCurrentThreadId(); // Получаем ID текущего потока.
 
    pCtrl->wait_for_start(); // Ждем сигнала "старт".
 
    for (;;)
    {
        if (false != pCtrl->check_for_quit()) // Проверка на завершение.
        {
            break;
        }
 
        Sleep(rand() % 300); // Рандомная задержка.
        
        // Синхронизация доступа к deque (например, на основе CRITICAL_SECTION или spin-lock).
 
        scoped_lock_t ScopedLock(pCtrl->SyncObject);
 
        // Помещаем новый элемент в контейнер.
        item NewItem = {ThreadId};
        pCtrl->Deque.push_back(NewItem);
        
        // Проверка на переполнение.
 
        if (pCtrl->Deque.size() > MaxItems)
        {
            pCtrl->Deque.pop_front();
        }
        
        // Проверка на то, что элемент в голове был вставлен другим потоком.
 
        else if (false == pCtrl->Deque.empty())
        {
            if (ThreadId != pCtrl->Deque.front().ThreadId)
            {
                pCtrl->Deque.pop_front();
            }
        }        
    }
 
    return 0;
}
 
Текущее время: 13:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru