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

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

Восстановить пароль Регистрация
 
mhg
2 / 2 / 2
Регистрация: 21.04.2013
Сообщений: 185
05.08.2014, 12:37     Поток, удаляющий элементы, воспринимает контейнер пустым #1
Есть два потока, один только кладет в контейнер, другой удаляет элемент, почему то поток который удаляет элемент, воспринимает контейнер пустым.
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);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 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++
6543 / 3963 / 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     Поток, удаляющий элементы, воспринимает контейнер пустым
Ответ Создать тему
Опции темы

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