Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
info_infoman
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 7
#1

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

19.11.2014, 15:14. Просмотров 221. Ответов 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 ? - C++
Нужно заполнить с главного массива(mas_g) один массив(mas1) елементы с чётными номерами, а в другой(mas2) с нечётными. Вот то, что я...

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

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

Обойтись без If ? - C++
Доброго времени суток, уважаемые форумчане. Помогите, пожалуйста, разобраться со сложившейся ситуацией. Есть код: for(it =...

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

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

3
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
19.11.2014, 19:13 #4
Цитата Сообщение от info_infoman Посмотреть сообщение
исключение сработает? или приложение выдаст ошибку?
Может вообще ничего не произойти, а приложение начнет работать дальше неправильно. Это неопределенное поведение.
0
19.11.2014, 19:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 19:13
Привет! Вот еще темы с ответами:

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

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Как обойтись без указателей и указателей на указатель? - C++
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace...

mutex - C++
День добрый. Прошу объяснить мне дураку m_hShared = OpenMutex(MUTEX_ALL_ACCESS, TRUE, L&quot;FileMutexEx&quot;); if(m_hShared) ...


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

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

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