469,081 Members | 1,652 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,081 developers. It's quick & easy.

thread safety and std::map

Hi,
I am trying to write a program which has two threads one of them write
to a map , and the other one deletes entries based on a certain
criterion..
first I cannot get the delete portion to work , what am i missing
here.
also is it possible/correct that the removeKeyValue function acquire
the mutex lock only during the call to map.erase(), and not the during
the whole iteration process as i have done here( i logically felt it
was safer to lock up the whole iteration ) but that can take up
massive amounts of time when the addKeyValue function would wait for
the lock to be released...

Thanks in advance
Digz
#include<map>
#include<iostream>
#include<boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/bind.hpp>
#include<time.h>

boost::mutex _mutex;
typedef boost::mutex::scoped_lock Lock;
typedef std::map <int, time_t>::iterator mapIter;
std::map <int, time_ttimerMap;

void addKeyValue (std::map < int, time_t &map) {
int i = 0;
time_t t;
while (true) {
{
Lock guard (_mutex);
map[++i] = time (&t);
std::cout << "added: " << i << ", " << t << std::endl;
} //end lock
sleep (1);
} //end while
}

void removeKeyValue (std::map < int, time_t &map) {
time_t t;
while (true) {
{
Lock guard1 (_mutex);
mapIter end = map.end ();
for (mapIter beg = map.begin (); beg != end;) {
if (time (&t) - (*beg).second 3) {//anything older than 3
seconds needs attention
std::cout << "removing: " << (*beg).first << ", " <<
(*beg).second << std::endl;
map.erase (beg++);
}
else
++beg;
} //end for
} //end lock scope
} //end while true
}

int main ()
{
boost::thread t (boost::bind (addKeyValue, timerMap));
boost::thread u (boost::bind (removeKeyValue, timerMap));
t.join();
u.join();
}

----------------

Mar 4 '07 #1
2 4888
"digz" <Di********@gmail.comwrote in message
news:11**********************@j27g2000cwj.googlegr oups.com...
Hi,
I am trying to write a program which has two threads one of them write
to a map , and the other one deletes entries based on a certain
criterion..
first I cannot get the delete portion to work , what am i missing
here.
also is it possible/correct that the removeKeyValue function acquire
the mutex lock only during the call to map.erase(), and not the during
the whole iteration process as i have done here( i logically felt it
was safer to lock up the whole iteration ) but that can take up
massive amounts of time when the addKeyValue function would wait for
the lock to be released...

Thanks in advance
Digz
#include<map>
#include<iostream>
#include<boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/bind.hpp>
#include<time.h>

boost::mutex _mutex;
typedef boost::mutex::scoped_lock Lock;
typedef std::map <int, time_t>::iterator mapIter;
std::map <int, time_ttimerMap;

void addKeyValue (std::map < int, time_t &map) {
int i = 0;
time_t t;
while (true) {
{
Lock guard (_mutex);
map[++i] = time (&t);
std::cout << "added: " << i << ", " << t << std::endl;
} //end lock
sleep (1);
} //end while
}

void removeKeyValue (std::map < int, time_t &map) {
time_t t;
while (true) {
{
Lock guard1 (_mutex);
mapIter end = map.end ();
for (mapIter beg = map.begin (); beg != end;) {
if (time (&t) - (*beg).second 3) {//anything older than 3
seconds needs attention
std::cout << "removing: " << (*beg).first << ", " <<
(*beg).second << std::endl;
map.erase (beg++);
}
else
++beg;
} //end for
} //end lock scope
} //end while true
}

int main ()
{
boost::thread t (boost::bind (addKeyValue, timerMap));
boost::thread u (boost::bind (removeKeyValue, timerMap));
t.join();
u.join();
}

----------------
comp.programming.threads may be a better newsgroup for this question.

You say, "I cannot get the delete portion to work" how is it not working?
Is it not deleting the entries or locking up or... ?

Mar 4 '07 #2
On Mar 4, 1:43 pm, "Jim Langston" <tazmas...@rocketmail.comwrote:
"digz" <Digvijo...@gmail.comwrote in message

news:11**********************@j27g2000cwj.googlegr oups.com...
Hi,
I am trying to write a program which has two threads one of them write
to a map , and the other one deletes entries based on a certain
criterion..
first I cannot get the delete portion to work , what am i missing
here.
also is it possible/correct that the removeKeyValue function acquire
the mutex lock only during the call to map.erase(), and not the during
the whole iteration process as i have done here( i logically felt it
was safer to lock up the whole iteration ) but that can take up
massive amounts of time when the addKeyValue function would wait for
the lock to be released...
Thanks in advance
Digz
#include<map>
#include<iostream>
#include<boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/bind.hpp>
#include<time.h>
boost::mutex _mutex;
typedef boost::mutex::scoped_lock Lock;
typedef std::map <int, time_t>::iterator mapIter;
std::map <int, time_ttimerMap;
void addKeyValue (std::map < int, time_t &map) {
int i = 0;
time_t t;
while (true) {
{
Lock guard (_mutex);
map[++i] = time (&t);
std::cout << "added: " << i << ", " << t << std::endl;
} //end lock
sleep (1);
} //end while
}
void removeKeyValue (std::map < int, time_t &map) {
time_t t;
while (true) {
{
Lock guard1 (_mutex);
mapIter end = map.end ();
for (mapIter beg = map.begin (); beg != end;) {
if (time (&t) - (*beg).second 3) {//anything older than 3
seconds needs attention
std::cout << "removing: " << (*beg).first << ", " <<
(*beg).second << std::endl;
map.erase (beg++);
}
else
++beg;
} //end for
} //end lock scope
} //end while true
}
int main ()
{
boost::thread t (boost::bind (addKeyValue, timerMap));
boost::thread u (boost::bind (removeKeyValue, timerMap));
t.join();
u.join();
}
----------------

comp.programming.threads may be a better newsgroup for this question.

You say, "I cannot get the delete portion to work" how is it not working?
Is it not deleting the entries or locking up or... ?
Thanks
Will post to the correct list ,however to be clear
It is not deleting the entries , when i try gdb debug , the begin !=
end test always fails
and the deleting thread is never able to enter the iteration loop,
In normal execution , i only see stuff getting added (the cout
messages)
but none of getting deleted..

Mar 6 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Woodster | last post: by
1 post views Thread by Antti Granqvist | last post: by
2 posts views Thread by Serengeti | last post: by
1 post views Thread by Saeed Amrollahi | last post: by
19 posts views Thread by Erik Wikström | last post: by
13 posts views Thread by kamaraj80 | last post: by
8 posts views Thread by mveygman | last post: by
reply views Thread by zhoujie | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.