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

Исключения в потоках - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Последовательность выполнения операций http://www.cyberforum.ru/cpp-beginners/thread812655.html
Qt 4.6 кросс-компиляция под Qtopia 4.5. g++. В целом, можно считать чистым с++. book ok; ok = ... true/false; ok = ok && Foo(); Если в ходе выполнения программы ok = false, то функция Foo() может не вызываться (нерегламентированное поведение). В частности: один раз скомпилировал - не запускается; пересобрал - запустилась. Вопрос заключается в следующем: 1) Как выйти из ситуации так,...
C++ fopen, _write, _read с динамическим именем файла Много перерыл, не нашел. Нужно открывать файл с динамическим названием strcpy_s(cc, "name.par"); FILE *fp=fopen(cc,"r"); Так работает, но если я получаю название файла, предположим через String^ nameT; DateTime^ date; date=DateTime::Now;... http://www.cyberforum.ru/cpp-beginners/thread812652.html
C++ Как переделать программу из Borland C в С++?
Доброго времени суток! Помогите, пожалуйста, переделать программу из Borland C 3.1 в С++. Задача такова: "Написать программу, вычисляющую разность суммы квадратов первой и четвертой цифры и суммы квадратов второй и третьей цифры заданного четырехзначного числа." Код для Borland C 3.1: void main() { int n,y;
Задачи по теме: Обработка символьной и строковой информации C++
Помогите пожалуйста решить задачи 1. Подсчитать сколько раз в заданном тексте встречается заданный символ.
C++ Простой путь к системным папкам http://www.cyberforum.ru/cpp-beginners/thread812601.html
Прошу прощения т.к такие темы были и не раз, но ответ был всегда в стиле: Дофига всякой ненужной всячены для консолек. А мне нужен простой и доступный ответ в стиле: Environment::SystemDirectory->ToString(); //получение сис. папки А не миллион ненужных строк. Для папки временных данных и пути к жестким дискам. З.Ы: Наверника есть что-то как на VB.NET Нужно по такому же типу.
C++ Составить блок-схему, алгоритм вычисления и программу для вычисления значения кусочно заданной функции помогите пожалуйста =) заранее благодарен =) П.5.19.Правил Запрещено создавать темы в виде ссылок на задания или коды программ, расположенные на других сайтах. П.5.18.Правил Запрещено размещать задания и решения в виде картинок и других файлов с их текстом. Редактор формул внизу страницы Добавлено через 36 секунд http://s018.***********/i511/1303/37/3611a86500c1.bmp помогите пожалуйста... подробнее

Показать сообщение отдельно
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2

Исключения в потоках - C++

19.03.2013, 14:24. Просмотров 458. Ответов 7
Метки (Все метки)

Кто читал книгу Параллельное программирование на С++ в действии; у меня возник вопрос из 8 главы. Какая роль в нижеприведенном коде класса join_threads, зачем потоки присоединять в деструкторе при исключении? Программа же все равно будет прервана при первом срабатывании исключения, а те потоки, которые еще работают сами по себе и завершатся при уничтожении вектора потоков threads с соответствующими им вызовами terminated. Или это такой "правильный" стиль программирования автор книги хочет нам показать?
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
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <thread>
#include <future>
#include <stdexcept>
 
class join_threads
{
    std::vector<std::thread>& threads;
public:
    explicit join_threads(std::vector<std::thread>& threads_): threads(threads_) {}
    ~join_threads()
    {
        for (unsigned long i = 0; i<threads.size(); ++i)
        {
            if (threads[i].joinable())
            {
                std::cout<<"thread joined\n";
                threads[i].join();
            }
                
        }
    }
};
 
template<typename Iterator,typename Func>
void parallel_for_each(Iterator first,Iterator last,Func f)
{
    unsigned long const length=std::distance(first,last);
 
    if(!length)
        return;
 
    unsigned long const num_threads = std::thread::hardware_concurrency();
 
    unsigned long const block_size=length/num_threads;
 
    std::vector<std::future<void> > futures(num_threads);
    std::vector<std::thread> threads(num_threads);
    join_threads joiner(threads);
 
    Iterator block_start=first;
    for(unsigned long i=0;i<num_threads;++i)
    {
        Iterator block_end=block_start;
        std::advance(block_end,block_size);
        std::packaged_task<void(void)> task([=](){std::for_each(block_start,block_end,f);});
        futures[i]=task.get_future();
        threads[i]=std::thread(std::move(task));
        block_start=block_end;
    }
    std::for_each(block_start,last,f);
    for(unsigned long i=0;i<num_threads;++i)
    {
        futures[i].get();
    }
}
 
void oops(const unsigned i)
{ 
    if (i == 0) throw std::out_of_range("i == 0") ;
    std::cout<<i<<"\n";
}
 
int main()
{
    std::vector<int> v = {30,31,32,33,34,0,36,37,38,39,0};
    try
    {
        parallel_for_each(v.begin(), v.end(), oops);
    }
    catch(const std::out_of_range& oor)
    {
        std::cerr << "Out of Range error: " << oor.what() << '\n';
    }
    
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru