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

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

Войти
Регистрация
Восстановить пароль
 
mhg
2 / 2 / 2
Регистрация: 21.04.2013
Сообщений: 185
#1

Поток, удаляющий элементы, воспринимает контейнер пустым - C++

05.08.2014, 12:37. Просмотров 224. Ответов 4
Метки нет (Все метки)

Есть два потока, один только кладет в контейнер, другой удаляет элемент, почему то поток который удаляет элемент, воспринимает контейнер пустым.
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
//mutex
pthread_mutex_t count_mutex;
 
//поток кладет в контейнер 
void put1 (multimap <int, int> *map2)
{
multimap <int, int> *map3 = map2;
while (1)
{
pthread_mutex_lock (&count_mutex);
printf("mutex start %d", getpid());
flushall();
printf ("put");
map3->insert( pair <int, int >(3,5));
printf ("mutex stop %d", getpid ());
pthread_mutex_unlock (&count_mutex) ;
}
}
 
//Поток удаляет из контейнера
void get(multimap <int, int> *map2)
{
multimap <int, int> *map3 = map2;
while (1)
{
pthread_mutex_lock (&count_mutex);
printf("mutex start %d", getpid());
flushall();
if(! map3->empty())
{
printf ("erase");
map3->erase(map3->begin ());}
else{
printf ("map empty ");}
 
printf ("mutex stop %d", getpid ());
pthread_mutex_unlock (&count_mutex) ;
}
}
 
int main ()
{
multimap < int, int> mapp;
mapp.insert (pair <int, int>(3, 5));
pid_t pid;
if (pid = fork()){}
else{
get(&mapp);
}
put1(&mapp);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2014, 12:37     Поток, удаляющий элементы, воспринимает контейнер пустым
Посмотрите здесь:

C++ char не воспринимает %c, но воспринимает %s
C++ Не воспринимает тип данных
удалить из массива повторяющиеся элементы, оставив только их первые вхождения. класс-контейнер вектор C++
Почему компилятор не воспринимает define константу C++
Не воспринимает кириллицу C++
C++ Вижал студио не воспринимает чар
C++ Не воспринимает проверку
Студия не воспринимает операторы С++ C++
C++ Не воспринимает русский язык
VS не воспринимает пользовательские классы C++
C++ Записать неповторяющиеся элементы в новый контейнер
Компилятор не воспринимает русские буквы C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2583 / 235
Регистрация: 01.11.2011
Сообщений: 6,391
Завершенные тесты: 1
05.08.2014, 12:40     Поток, удаляющий элементы, воспринимает контейнер пустым #2
В одиннадцатой и двадцать седьмой строке кавычки закрывающие забыли.
mhg
2 / 2 / 2
Регистрация: 21.04.2013
Сообщений: 185
05.08.2014, 16:22  [ТС]     Поток, удаляющий элементы, воспринимает контейнер пустым #3
Вывод на консоль:
mutex start 1171483
Insert
Mutex stop 1171483
mutex start 1171467
Erase
Mutex stop 1171467
mutex start 1171483
Insert
Mutex stop 1171483
mutex start 1171467
Map empty
Mutex stop 1171467
mutex start 1171483
Insert
Mutex stop 1171483
mutex start 1171467
Map empty
Mutex stop 1171467

Добавлено через 1 минуту
Ага, с телефона набираю

Добавлено через 3 часа 32 минуты
Проблема решена, создавать второй поток лучше функцией pthread_create(), fork() здесь лучше не использовать
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.08.2014, 16:40     Поток, удаляющий элементы, воспринимает контейнер пустым #4
Цитата Сообщение от mhg Посмотреть сообщение
Проблема решена, создавать второй поток лучше функцией pthread_create(), fork() здесь лучше не использовать
ололо...иди учи матчасть и читай доку. fork вообще другой процесс создает с другим адресным пространством
mhg
2 / 2 / 2
Регистрация: 21.04.2013
Сообщений: 185
05.08.2014, 16:51  [ТС]     Поток, удаляющий элементы, воспринимает контейнер пустым #5
У меня до последнего момента была уверенность что fork() создает поток, надо быть внимательней
Yandex
Объявления
05.08.2014, 16:51     Поток, удаляющий элементы, воспринимает контейнер пустым
Ответ Создать тему
Опции темы

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