Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
info_infoman
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 7
#1

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

19.11.2014, 15:14. Просмотров 260. Ответов 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");
    }
?????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 15:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Можно ли обойтись без mutex? (C++):

можно ли обойтись без IF ?
Нужно заполнить с главного массива(mas_g) один массив(mas1) елементы с чётными...

Можно ли обойтись без разыменования адресов на элементы
Вот куски кода (полный код тут): // Double Bitset 85 bitset&lt;ULONG_MAX&gt;...

Зачем нужен iterator, если можно обойтись без него?
Почему нужен итератор(iterator) если этот код #include &lt;iostream&gt;...

Обойтись без If ?
Доброго времени суток, уважаемые форумчане. Помогите, пожалуйста, разобраться...

Как обойтись без виртуальных конструкторов?
Я перехожу с Delphi. Многое там строится на виртуальных конструкторах, как без...

Функция abs и как обойтись без нее
Нужна помощь. При написании кода столкнулся с некой проблемой, что при...

3
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.11.2014, 17:06 #2
Цитата Сообщение от info_infoman Посмотреть сообщение
но приведет ли?
Приведет.
0
info_infoman
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 7
19.11.2014, 19:01  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Приведет.
исключение сработает? или приложение выдаст ошибку?

мне не важно какой из потоков сработает (первым внесет данные в контейнер)
главное чтобы приложение не вылетело
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
19.11.2014, 19:13 #4
Цитата Сообщение от info_infoman Посмотреть сообщение
исключение сработает? или приложение выдаст ошибку?
Может вообще ничего не произойти, а приложение начнет работать дальше неправильно. Это неопределенное поведение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 19:13
Привет! Вот еще темы с решениями:

Переделать программу, чтобы она выполнялась без использования примитива синхронизации Mutex
Необходимо переделать программу так, чтобы она выполнялась без использования...

Как на блок-схеме обойтись без вводимых данных?
У меня есть, данная программа, как для неё нарисовать блок-схему? Ведь нет...

Когда стоит использовать класс, а когда лучше обойтись без них?
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru