我的程序中有一个映射来保存由pthread_create方法创建的pthread(需要放置此pthread的位置),与相关的线程ID相关联。
在pthread的函数的最后一个命令中是否存在从映射中删除pthread的问题?
答案 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_join
或pthread_detach
或创建一个已启用的线程,否则您有时会从pthread_create
收到错误。对于所有可连接的线程,OS保留一定量的内存来存储线程返回值。为此目的保留的内存总量是有限的,并且可能比您预期的少,因此请分离您不会加入的所有线程。
答案 3 :(得分:0)
您可以随时删除数据。但是,如果线程访问此映射,则程序中可能存在竞争条件。如果线程A退出但在删除其数据之前被换出,则线程B可能会看到线程A的数据,并认为线程A仍然是一个可行的线程。