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

Можно ли обойтись без mutex? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перестановка столбцов матрицы http://www.cyberforum.ru/cpp-beginners/thread1305017.html
Нужно отсортировать столбцы матрицы по убыванию сумм их элементов. Помогите с сортировкой, пожлуйста
C++ Подскажите пожалуйста что нужно исправлять #include <iostream> #include <math.h> using namespace std; int main() { double y, x, Pi; Pi = 3.14159; x = -Pi; while (x <= Pi) http://www.cyberforum.ru/cpp-beginners/thread1305006.html
Связь между программами C++
У меня есть одна программа на C++. В ней следовательно есть несколько переменных (например int i = 3 и String c = "test"). Необходимо создать программу на C++ Builder 6.0, которая сможет: 1. Получить список всех переменных программы. 2. Изменить переменные. 3. Прочитать переменные. И 2 вопрос: можно ли сделать две программы (именно программы, не формы) с общими переменными?
C++ Работа с XML файлами в Builder С++
Добрый день, уважаемые форумчане! Подскажите какие-нибудь учебники по работе с XML файлами в Builder С++. ПОЖАЛУЙСТА! в интернете ничего путного не нашла...А если кому не жалко, можете скинуть исходник
C++ Как разбить строку на предложения http://www.cyberforum.ru/cpp-beginners/thread1304991.html
Как разбить строку на предложения
C++ Не могу найти ошибку в форматировании текста здравствуйте, читая книгу Лафоре наткнулся на задачку (страница 90. Задача 11) в которой текст нужно выстроить красивой и аккуратной таблицей. Данный код по идее должен строить эту самую табличку, но не совсем так, во всяком случае у меня... использую компилятор NetBeans 8.0.1.... текст в результате выглядит примерно так: Фамилия Имя Адрес Город ... подробнее

Показать сообщение отдельно
info_infoman
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 7

Можно ли обойтись без mutex? - C++

19.11.2014, 15:14. Просмотров 194. Ответов 3
Метки (Все метки)

в оф мануале :
The following example includes a bank account of a person (Joe) and two components, one corresponding to a bank agent depositing money in Joe's account, and one representing Joe. Joe will only be withdrawing money from the account:
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
class BankAccount;
 
BankAccount JoesAccount;
 
void bankAgent()
{
    for (int i =10; i>0; --i) {
        //...
        JoesAccount.Deposit(500);
        //...
    }
}
 
void Joe() {
    for (int i =10; i>0; --i) {
        //...
        int myPocket = JoesAccount.Withdraw(100);
        std::cout << myPocket << std::endl;
        //...
    }
}
 
int main() {
    //...
    boost::thread thread1(bankAgent); // start concurrent execution of bankAgent
    boost::thread thread2(Joe); // start concurrent execution of Joe
    thread1.join();
    thread2.join();
    return 0;
}
From time to time, the bankAgent will deposit $500 in JoesAccount. Joe will similarly withdraw $100 from his account. These sentences describe that the bankAgent and Joe are executed concurrently.
говориться что данные будут появляться то так то эдак (неопределенность из-за одновременного внесения изменений в контейнер)

подскажите будет ли конфликт - если я имею некую программу:
1) обьявляю контейнер
C++
1
2
std::map<std::string,int> mmaapp;
std::map<std::string,int>::iterator it;
2) объявляю группировку
boost::thread_group curls;

3) далее идет функция для thred
C++
1
2
3
4
5
6
7
8
9
10
11
void CURLchecker(int block, std::string tx_id, std::string api_url, std::string api_token)  
{
    boost::this_thread::sleep_for(boost::chrono::seconds(2));
...........................................
........тут очень медленная функция CURL
...........................................
    ret = mmaapp.insert(std::make_pair(tx_id, block+10));
    if (ret.second==false) {
        printf("ERROR: insert in map_tx \n");
    }
}
5) тут int main в котором есть цикл
цикл запускается с периодичностью 10 секунд
и делает только 2 действия - уничтожение имеющихся записей и запуск потока добавления
перед циклом стоит
C++
1
2
3
4
5
6
7
curls.join_all();
 
while(true){
mmaapp.erase (it);
boost::thread* c=new boost::thread(&CURLchecker, nBestHeight, tx_id, api_url, api_token);
curls.add_thread(c);
}
а теперь вопрос:
нужен ли мутекс если потоки только добавляют новые записи
а удаление и тп идет только в следующей итерации цикла в самом цикле а не в потоках
и только после join_all
и точно известно что цикл делает все итерации быстрее чем 2 секунды(задержка исполнения нового потока)?

чисто теоретически может произойти что оба потока будут пытаться одновременно инсертить
что приведет к неопределенному результату
но приведет ли? если я буду использовать исключение
C++
1
2
3
4
    ret = mmaapp.insert(std::make_pair(tx_id, block+10));
    if (ret.second==false) {
        printf("ERROR: insert in map_tx \n");
    }
?????
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru