Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 1
Регистрация: 21.04.2013
Сообщений: 205
1

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

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

Author24 — интернет-сервис помощи студентам
Есть два потока, один только кладет в контейнер, другой удаляет элемент, почему то поток который удаляет элемент, воспринимает контейнер пустым.
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);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2014, 12:37
Ответы с готовыми решениями:

Добавить в шаблон класса CList метод, удаляющий из списка все элементы со значением N
Цель такова, сделать метод удаляющий из списка все элементы со значением N, с обычными типами...

Запускать поток если контейнер не пустой
Доброго времени суток. Как можно реализовать следующее. Один поток пишет в контейнер, второй должен...

Предикат, удаляющий из исходного списка элементы с четными номерами
Помогите с программой пожалуйста. Создайте предикат, удаляющий из исходного списка элементы с...

char не воспринимает %c, но воспринимает %s
Вопрос в строке &quot;fprintf(f, &quot;%s&quot;, text);&quot;. Переменная text имеет тип char, однако если я пишу %c,...

4
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
05.08.2014, 12:40 2
В одиннадцатой и двадцать седьмой строке кавычки закрывающие забыли.
0
2 / 2 / 1
Регистрация: 21.04.2013
Сообщений: 205
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() здесь лучше не использовать
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.08.2014, 16:40 4
Цитата Сообщение от mhg Посмотреть сообщение
Проблема решена, создавать второй поток лучше функцией pthread_create(), fork() здесь лучше не использовать
ололо...иди учи матчасть и читай доку. fork вообще другой процесс создает с другим адресным пространством
0
2 / 2 / 1
Регистрация: 21.04.2013
Сообщений: 205
05.08.2014, 16:51  [ТС] 5
У меня до последнего момента была уверенность что fork() создает поток, надо быть внимательней
0
05.08.2014, 16:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2014, 16:51
Помогаю со студенческими работами здесь

Элемент-контейнер, центрирующий дочерние элементы
Здравствуйте! Подскажите как сделать, чтоб элемент управления (а в идеале, несколько) всегда был по...

Записать неповторяющиеся элементы в новый контейнер
Помогите, пожалуйста, нужно написать программу на экзамене Написать функцию, перебирающую...

Как удалить элементы используя контейнер STL ?
здесь удаляется по одному элементу, (т.е. передаётся один итератор), а как удалить сразу несколько...

Сжать массив, выбросив из него отрицательные элементы - массив становится пустым
Задачка такая: Разработать программу, обеспечивающую ввод с клавиатуры целых чисел и сохранение их...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru