Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

MSVC - читаем файл в 2х потоках

11.04.2016, 14:29. Показов 645. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Устал бороться с MSVC, может я чего-то не вижу, помогите найти ошибку (пример очень упрощенный)

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
struct manager
{
    static manager& get()
    {
        static manager m;
        return m;
    }
 
    manager() : my_file("/path/to/file.txt")
    {
    }
 
    std::string next()
    {
        boost::unique_lock<boost::mutex> lock(mtx);
        urls >> next_line;
        return next_line;
    }
 
    std::ifstream my_file;
    std::string next_line;
    boost::mutex mtx;
};
 
boost::thread_group g;
for (int i = 0; i < N; i++) {
    g.create_thread([]() {
           manager &m = manager::get();
           std::string l = m.next();
    });
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
}
Сначала у меня было access violation при использовании std::mutex, нагуглил что это баг моей версии студии. Жесть! Тупо не работают мютексы в студии, тупо б****ь мьютексы не работают, как так то? Заменил на буствые, теперь синхронизация работает, но файл не читается (next_line пустая, а условие if (my_file) не проходит, т.е. поток пришел в негодное состояние). Нюанс - если создать только 1 поток, то все читается, если создать хотя бы 2 потока, то файл уже не читается.
Вопрос - чего я не вижу?

Не по теме:


P.S. 2 часа и куча нервов тупо на баги студии, в опен сорсном линуксе, который все так ненавидят, потому он опен сорс, а значит пропитан багами, никогда такого не видел, НИКОГДА



Добавлено через 1 минуту

Не по теме:

вот опять день закончится пивом, майкрософт меня спаивает

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2016, 14:29
Ответы с готовыми решениями:

Читаем длинное число из файл.
Доброго времени суток) У меня такой вопрос. Как можно прочитать длинное число (превышающее стандартные типы данных) из файла в массив......

Почему в MSVC++ 2008 компилируется, а в MSVC++ 2010 вылезает много ошибок?
Кстати, перед запуском в 2010 предлагает конвертировать код. Ну а чем эти две студии отличаются, что вызывает большое количество ошибок?

читаем один файл->реверс->в новый файл
Есть код программы реверс, в котором реверсируется string1 в string2. .model small .stack 100h .data string1 db 256 dup ('$') ...

15
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 14:42
Так у тебя древняя версия наверное.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2016, 14:43  [ТС]
Короче сишные средства для работы с файлами вроде решили проблему. Вот так вот, в 2016 году программируя в майкрософтовской среде на С++ я вынужден писать
C
1
2
FILE *my_file = fopen(...);
fscanf(my_file, ....);
чему я несказанно рад.

Добавлено через 38 секунд
nmcf, 2013, С++11 частично поддерживается, да оно бы и не скомпилировалось, если бы не поддерживалось.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 15:02
Может, патчи нужны?
1
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
11.04.2016, 15:29
Kastaneda, я потыкал твой код - он рабочий. Использовал Visual Studio 2012. И мьютексы местные (виндовские) работают. ХЗ, что не так у тебя там может быть...

Вот, что я у себя компилировал (на случай, что я не так понял проблему):
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <string>
#include <fstream>
#include <mutex>
 
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
 
struct manager
{
    static manager& get()
    {
        static manager m;
        return m;
    }
 
    manager() : my_file("d:\\logs\\somefile.txt")
    {
    }
 
    std::string next()
    {
        //boost::unique_lock<boost::mutex> lock(mtx);
        std::lock_guard<std::mutex> lock(mtx);
 
        my_file >> next_line;
        return next_line;
    }
 
    std::ifstream my_file;
    std::string next_line;
    //boost::mutex mtx;
    std::mutex mtx;
};
 
int main()
{
    boost::thread_group g;
    for (int i = 0; i < 3; i++) {
        g.create_thread([]() {
            manager &m = manager::get();
            std::string l = m.next();
            std::cout << l << std::endl;
        });
        boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    }
 
    std::cout << "\ndone" << std::endl;
    std::cin.get();
 
    return 0;
}
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2016, 15:38  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
И мьютексы местные (виндовские) работают
а std::mutex работает?

Вообще я давно уже грешу на эту версию студии, похоже именно в ней дофига багов.

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Может, патчи нужны?
сложно сказать...
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
11.04.2016, 15:46
скорее всего баг студии, к ней насколько помню много патчей шло и не всегда они устанавливались нормально, msvc 2015, на 50 потоков
Кликните здесь для просмотра всего текста

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
//#include ...
 
 
void main(){
std::atomic<bool> atom_start = ATOMIC_VAR_INIT(false);
    std::vector<std::thread*> vc_thr;
    for (int i = 0; i < 50; i++) {
        auto pthread = new std::thread([&]() {
            std::ifstream stream("C\\test.txt");
            std::string str;
            assert(stream.is_open());
            while (std::atomic_load(&atom_start) != true)
                std::this_thread::sleep_for(std::chrono::milliseconds(3));
            while (!stream.eof()) 
                getline(stream, str);
            
            stream.close();
        });
        vc_thr.push_back(pthread);
        std::atomic_exchange(&atom_start, true);
    }
    
    for (auto pth : vc_thr) {
        if (pth) {
            pth->join();
            delete pth;
        }
    }
}
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2016, 15:50  [ТС]
Цитата Сообщение от ssXXss Посмотреть сообщение
к ней насколько помню много патчей шло
Цитата Сообщение от nmcf Посмотреть сообщение
Может, патчи нужны?
Спасибо за наводку, попробую поискать патчи. Полностью все переставлять нехота по некоторым причинам.
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
11.04.2016, 15:55
Цитата Сообщение от Kastaneda Посмотреть сообщение
Полностью все переставлять нехота по некоторым причинам.
скорее всего придется , может проще перейти на msvc 2015
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2016, 15:59  [ТС]
Цитата Сообщение от ssXXss Посмотреть сообщение
может проще перейти на msvc 2015
не в моем случае, мне пришлось изрядно поработать напильником, чтобы та технология, с которой я вынужден работать, завелась на 2013, для 2015 думаю будет не меньше проблем, поэтому пропатчить будет проще.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.04.2016, 16:05
Так может ты перестарался, лишнего сточил, вот и не работает mutex?
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
11.04.2016, 16:09
ну как вариант, прикрутить к студии интеловсий компилятор (Intel Parallel Studio 2013 \ 2015) с поддержкой с++ 11, прикручивается нормуль и снимает кучу проблем.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2016, 16:12  [ТС]
ssXXss, чего не знал, так это то что к студии можно прикрутить другой компилятор, спасибо! На выходных будет время обязательно попробую.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,450
11.04.2016, 16:44
Цитата Сообщение от Kastaneda Посмотреть сообщение
а std::mutex работает?
Да, работает.

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
чего не знал, так это то что к студии можно прикрутить другой компилятор,
Студия вообще умеет работать с Makefile-ами, так, что хоть GCC используй))
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.04.2016, 17:21  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Студия вообще умеет работать с Makefile-ами, так, что хоть GCC используй))
Да я тут подумал, не подходит мне вариант со сменой компилятора, т.к. заказчик у себя использует студию со студийным компилятором. Сложно будет ему объяснить зачем он должен заморачиваться со сменой компилятора, если весь код, который я коммичу, и без того работает.
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
11.04.2016, 17:42
если код будет собираться под виндой то можно использовать winapi писонины конечно больше в разы но зато нужный результат можно получить, чтение файла из нескольких потоков,CreateFile(...) указывая права доступа к файлу FILE_SHARE_READ .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2016, 17:42
Помогаю со студенческими работами здесь

Читаем текстовый файл а первые 4 строки все портят
Приветствую! Может кто встречался с таким извращением? Открывем Open Path &amp; name For Input As FileNumber выполняем Do While Not...

Записать файлы указанного каталога в файл (поиск и запись осуществить в разных потоках)
вроде бы все правильно но вывода нет, что не так? Функция задания button_3 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,...

Читаем о Яше
Ozon.ru: http://www.ozon.ru/context/detail/id/2502457/ &lt;b&gt;Формат: PDF&lt;/b&gt; 1....

Читаем со ссылки
private void Form1_Load(object sender, EventArgs e) { System.Net.WebClient wc = new System.Net.WebClient(); ...

Читаем из файла.
Как же можно считать из файла цифры и использовать их в вычислениях, уравнениях? Вот накалякал функцию, но не много не то. Цифры...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru