在运行时擦除保持pthread的变量

时间:2011-04-05 14:50:33

标签: c++ map pthreads erase

我的程序中有一个映射来保存由pthread_create方法创建的pthread(需要放置此pthread的位置),与相关的线程ID相关联。
在pthread的函数的最后一个命令中是否存在从映射中删除pthread的问题?

4 个答案:

答案 0 :(得分:4)

正如你所说,你持有线程ID。这只是一个数字。没什么。

删除元素(数字)不会对您的程序造成任何伤害。

编辑:但是你应该检查std::map中的删除元素是否已完成同步。不要忘记STL容器可能不是线程安全的。有关详细信息,请参阅this问题。

Edit2 :为了确保您没有同步问题,请执行以下操作:

pthread_mutex_t mut;         //global variable
pthread_mutex_init(&mut,0);  //initialize mutex before calling pthread_create()



//and use mutex to prevent synchronization problems in the end of .
pthread_mutex_lock(&mut);
my_map.erase(key);
pthread_mutex_unlock(&mut);

答案 1 :(得分:1)

我同意Ashot Martirosyan提供的答案。我只想补充一点。

如果线程被创建为可连接,那么您的应用程序将需要调用pthread_join();否则你会泄漏内存。如果映射是唯一记录线程ID的地方,那么如果每个线程在它死亡之前从地图中删除了它的线程ID,那么你将无法与线程连接。

答案 2 :(得分:0)

您应该pthread_joinpthread_detach或创建一个已启用的线程,否则您有时会从pthread_create收到错误。对于所有可连接的线程,OS保留一定量的内存来存储线程返回值。为此目的保留的内存总量是有限的,并且可能比您预期的少,因此请分离您不会加入的所有线程。

答案 3 :(得分:0)

您可以随时删除数据。但是,如果线程访问此映射,则程序中可能存在竞争条件。如果线程A退出但在删除其数据之前被换出,则线程B可能会看到线程A的数据,并认为线程A仍然是一个可行的线程。