我的程序中有一个映射来保存由 pthread_create 方法创建的 pthreads(需要一个放置此 pthread 的地方),并与相关的线程 ID 相关联。
在 pthread 函数的最后一个命令中从映射中擦除 pthread 是否存在问题?
问问题
247 次
4 回答
4
正如你所说,你持有线程 ID。这只是一个数字。而已。
擦除元素(数字)不会对您的程序造成任何损害。
编辑:但是你应该检查,擦除元素std::map
是同步完成的。不要忘记 STL 容器可能不是线程安全的。有关更多信息,请参阅此问题。
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);
于 2011-04-05T15:01:19.957 回答
1
我同意 Ashot Martirosyan 提供的答案。我只想补充一点。
如果线程被创建为可连接的,那么您的应用程序将需要调用pthread_join()
;否则你会泄漏内存。如果映射是您记录线程 ID 的唯一位置,那么如果每个线程在其死亡之前从映射中删除其线程 ID,您将无法加入线程。
于 2011-04-05T15:20:03.140 回答
0
你应该或者pthread_join
或者pthread_detach
创建一个分离的线程,否则你会从pthread_create
某个时候得到一个错误。对于所有可连接的线程,操作系统会保留一些内存来存储线程返回值。为此目的保留的内存总量是有限的,并且可能比您预期的要少,因此请分离您不打算加入的所有线程。
于 2011-04-05T16:03:16.277 回答
0
您可以随时删除数据。但是,如果线程访问此映射,您的程序中可能存在竞争条件。如果线程 A 正在退出但在擦除其数据之前被换出,线程 B 可能会看到线程 A 的数据并认为线程 A 仍然是一个可行的线程。
于 2011-04-06T23:19:01.300 回答