在运行时擦除持有pthread的变量
erasing the variable holding a pthread while running
我的程序中有一个映射,用于保存由pthread_create方法创建的pthread(该方法需要一个放置该pthread的位置),并与相关的线程ID相关联。
在pthread函数的最后一个命令中是否存在从映射中擦除pthread的问题?
正如您所说,您正在持有线程ID。它只是一个数字。仅此而已。
删除元素(number)不会对程序造成任何损害。
编辑:但是你应该检查一下,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);
我同意Ashot Martirosyan提供的答案。我只是想再补充一点。
如果线程被创建为可连接的,那么应用程序将需要调用pthread_join()
;否则会泄漏内存。如果map是唯一记录线程ID的地方,那么如果每个线程在死亡之前从map中删除了它的线程ID,那么您将无法与线程连接。
您可以随时删除数据。但是,如果线程访问这个映射,程序中可能会出现竞争条件。如果线程A正在退出,但在擦除数据之前被交换出去,线程B可能会看到线程A的数据,并认为线程A仍然是一个可行的线程。
您应该pthread_join
或pthread_detach
或创建一个分离的线程,否则您将从pthread_create
获得错误。对于所有可接合的线程,操作系统保留一定数量的内存来存储线程返回值。为此目的保留的总内存量是有限的,并且可能比您期望的要少,因此分离您不打算加入的所有线程。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- Pthread段错误,使用指向main中变量的指针
- 在 pthread 中使用共享变量
- 使用全局变量显示C++在使用 pthread 时比指针慢 100%?
- 成员变量的更新值不会在 PTHREAD 中的线程路由函数中重新排列
- C++ pthread,两个线程读取一个全局变量
- Pthread 条件变量即使设置为 PTHREAD_PROCESS_SHARED,也不会发出信号
- Pthread条件变量是连续轮询的替代品,是真的吗
- 在静态初始化期间,pthread线程变量何时开始存在
- pthread互斥锁定和解锁每个变量
- Pthread用于许多类变量
- Boost和Pthread条件变量之间的差异
- 从pthread访问外部类变量
- Pthread条件变量不可预测的结果
- 如何在没有__thread的情况下创建pthread特定的变量
- 线程同步pthread条件变量
- ' pthread '的运行函数如何修改外部变量
- 在运行时擦除持有pthread的变量