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

Зависание потоков. Работа с файлами - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Анализатор входящих сообщений сторонних ПО и сервисов http://www.cyberforum.ru/cpp-beginners/thread1228154.html
В WinAPI не силен, однако необходимо написать программу на С++, анализирующую входящие сообщения какого-нибудь сервиса обмена сообщениями, например вконтакте. По самому анализатору наброски есть, однако что абсолютно не могу понять - как моей программе получить входящие сообщения? Либо нужно как-то следить за открытым в другом окне браузером и отлавливать входящие, либо еще как-то... В общем...
C++ Возожно ли создать массив указателей на шаблоны функций? Можно ли создать массив указателей на шаблоны функций, если да, то как? Пробовал вот так template <class my_type> void my_func( my_type* input_arr) потом пытался запихнуть my_type* как аргумент функции, но компилятор ругается на то, что my_type не объявлен можно конечно сделать так: void (*p)(int*) = &my_func<int>; void (*pp)(float*) = &my_func<float>; но тогда получится несколько... http://www.cyberforum.ru/cpp-beginners/thread1228126.html
Программа должна моделировать взаимодействие серверной части и некоторого множества клиентских частей C++
Описание задачи Необходимо реализовать программу в ввиде одного исполняемого файла под Win32 (console или GUI) с использованием С/С++. Программа должна моделировать взаимодействие серверной части и некоторого множества клиентских частей (n <= 10). Серверная часть предназначена для обработки некоторых абстрактных транзакций, поступающих от множества клиентов. Серверная и клиентские процедуры...
После умножения очередей заполняется первый элемент очереди C++
пытаюсь умножить две очереди (первый элемент на все элементы второй очереди сложить и запихнуть в новую очередь) Но после такого умножения у меня заполняется первый элемент очереди а все остальные контейнеры принимают нулевое значение Polynomial Polynomial::poly_mult (Polynomial *a , Polynomial *b){ queue <int> t = a->get_coeff(); queue <int> p = b->get_coeff(); queue <int> result;...
C++ Дихотомия и интерполяционный поиск по отсортированному массиву http://www.cyberforum.ru/cpp-beginners/thread1228081.html
Естьчо в типовых/стандартных библиотеках для C или в STL? Спасибо
C++ Создать разное количество потоков с возможностью ожидания события из одного потока в другом Добрый день. Прошу подсказки в выборе высокоуровневых средств для работы с потоками. Мне нужно создавать разное количество потоков и что бы была возможность ожидания собитыя из одного потока в другом. Сделал это средствами WinApi - виндовый тред и событие. Подскажите, плз, куда копать в этом направлении, только не WinApi, а что-то более высокоуровневое. Я смотрел на boost::thread -... подробнее

Показать сообщение отдельно
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
16.07.2014, 15:57     Зависание потоков. Работа с файлами
Всем еще раз привет. Очень прошу помощи.
Пишу на С++ под винду, с учетом специфики проекта выбор остановился на boost library.

Пишу многопоточное приложение следующего вида:

создается несколько потоков. далее потоки поочереди читают файл, выполняют какую-то длительную логику и поочереди записывают в другой файл.

т.е. здесь важна очередность записи в файл, каждый поток ждет предыдущего:
например есть 3 потока.
- 1й поток прочитал, выполнил логику, записал и ждет пока 3й не закончит чтение файла.
- 2й ждал пока первый закончит чтение и начал читать файл далее, выполнять логику, потом проверяет, не записывает ли 1й в файл. Если нет - записывает 2й и т.д.

Для решения задачи
использую:
C++
1
2
3
4
5
    boost:: thread_group, делаю join_all();
    boost:: ptr_vector<boost::mutex> _readMutexArray;
    boost:: ptr_vector<boost::mutex> _writeMutexArray;
    boost:: ptr_vector<boost::condition_variable> _readConditionVarArray;
    boost:: ptr_vector<boost::condition_variable> _writeConditionVarArray;
Ниже примерный алгоритм работы программ:

Зависание потоков. Работа с файлами

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
void Decrypter::DecryptMultithreading(const std::string& sourceFilePath, const std::string& destinationFilePath, size_t threadId )
{
    while (_byteWrote != _fileSize)
    {
        WaitForEvent(threadId, _readMutexArray, _readConditionVarArray);
        _firstPart = false;
 
//       open file stream for sourceFilePath and read required bytes.
        
        _readConditionVarArray[threadId].notify_all();
 
//        smth decrypt logics here
 
        WaitForEvent(threadId, _writeMutexArray, _writeConditionVarArray);
 
//        open file stream for destinationFilePath and write required bytes.
//   _byteWrote += currentBlockSize;
 
        _writeConditionVarArray[threadId].notify_all();
    }
}
 
void Decrypter::WaitForEvent(int threadId, boost::ptr_vector<boost::mutex>& eventsArrayGuard, boost::ptr_vector<boost::condition_variable>& cond)
{
    size_t waitedThread = -1;
 
    if (0 == threadId && (_firstPart || 0 == _byteWrote))
    {
        return;
    }
    else
    {
        waitedThread = 0 == threadId ? _threadsCount: threadId;
    }
    --waitedThread;
 
    boost::unique_lock<boost::mutex> lock(eventsArrayGuard[waitedThread]);
    cond[waitedThread].wait(lock);
}
 
void Decrypter::CreateReadWriteEvents()
{
    for (size_t i = 0; i < _threadsCount; ++i)
    {
        _readMutexArray.push_back(new boost::mutex());
        _writeMutexArray.push_back(new boost::mutex());
 
        _readConditionVarArray.push_back(new boost::condition_variable());
        _writeConditionVarArray.push_back(new boost::condition_variable());
    }
}
У меня такая проблема: поток выходит из ожидания, только когда вызывается notify_() метод у cond. var.
В итоге все потоки у меня зависают на cond[waitedThread].wait(lock); после первого прохода.
Как бы тут выкрутиться?
было бы не плохо если бы было сигнальное состояние и нет.
Может кто-то подсказать куда копать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru