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

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

Восстановить пароль Регистрация
 
info_infoman
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 7
19.11.2014, 15:14     Можно ли обойтись без mutex? #1
в оф мануале :
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");
    }
?????
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
19.11.2014, 17:06     Можно ли обойтись без mutex? #2
Цитата Сообщение от info_infoman Посмотреть сообщение
но приведет ли?
Приведет.
info_infoman
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 7
19.11.2014, 19:01  [ТС]     Можно ли обойтись без mutex? #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Приведет.
исключение сработает? или приложение выдаст ошибку?

мне не важно какой из потоков сработает (первым внесет данные в контейнер)
главное чтобы приложение не вылетело
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
19.11.2014, 19:13     Можно ли обойтись без mutex? #4
Цитата Сообщение от info_infoman Посмотреть сообщение
исключение сработает? или приложение выдаст ошибку?
Может вообще ничего не произойти, а приложение начнет работать дальше неправильно. Это неопределенное поведение.
Yandex
Объявления
19.11.2014, 19:13     Можно ли обойтись без mutex?
Ответ Создать тему
Опции темы

Текущее время: 08:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru