pthread_attr_setstacksize and pthread_exit
pthread_attr_setstacksize and pthread_exit
我有一个关于64Mb Ram嵌入式系统中C并发编程的问题。特别是,我想减少线程使用的默认内存,所以我定义了:
pthread_attr_t attr_test;
size_t stacksize = 0x186A0; // 100Kbyte
pthread_attr_init(&attr_test);
pthread_attr_setdetachstate(&attr_test, PTHREAD_CREATE_DETACHED);
pthread_attr_setstacksize(&attr_test, stacksize);
因此,当线程启动时,它只使用100K字节的虚拟内存。但是当线程结束并调用pthread_exit时,进程使用的虚拟内存会迅速增加!。。。。
为什么?我能做什么?
谢谢!
更新:
线程->
void *thread_test(void *arg1) {
int *param;
param = (int*)arg1;
printf("Thread %d startn", *param);
pthread_cond_wait(&condition[*param], &mutex[*param]);
printf("Thread %d stopn",*param);
pthread_exit(0);
}
Main->
int main(void) {
pthread_t IDthread[MAX_THREADS];
int param[MAX_THREADS];
int pointer;
int i, keyb;
void *stkaddr;
size_t stacksize;
puts("!!! THREAD TEST !!!");
printf("Process ID %dnn", getpid());
for(i=0; i<MAX_THREADS; i++)
{
pthread_cond_init(&condition[i], NULL);
pthread_mutex_init(&mutex[i], NULL);
IDthread[i] = 0;
param[i] = i;
}
stacksize = 0x186A0; // 100Kbyte
pthread_attr_init(&attr_test);
pthread_attr_setdetachstate(&attr_test, PTHREAD_CREATE_DETACHED);
/* setting the size of the stack also */
pthread_attr_setstacksize(&attr_test, stacksize);
pointer = 0;
do {
keyb = getchar();
if (keyb == '1')
{
if (pointer < MAX_THREADS)
{
pthread_create(&IDthread[pointer], &attr_test, thread_test, ¶m[pointer]);
sleep(1);
pointer++;
}
else
puts("MAX Threads Number");
}
if (keyb == '2')
{
if (pointer != 0)
{
pointer--;
pthread_cond_signal(&condition[pointer]);
sleep(1);
}
else
puts("0 Thread is running");
}
} while (keyb != '0');
printf("FINEn");
return EXIT_SUCCESS;
}
可连接或分离线程存在已知问题,引用手册:
只有当已终止的可连接线程是其最后一个释放回系统的资源。当分离的线程终止时,其资源将自动释放回系统
你可以用使螺纹可拆卸
pthread_attr_setdetachstate(3)
您的测试存在一些问题。首先,pthread_attr_setstacksize有以下文档:
堆栈大小属性确定将分配给使用线程属性对象attr创建的线程的最小大小(以字节为单位)
因此,每个线程可以使用比您设置的更多的内容。但更重要的是,线程可以从操作系统中分配内存用作堆栈。这也适用于主线程。
因此,我不认为有一种方法可以通过查看top命令的结果来实现您想要的,因为这些信息只能从线程本身中看到。
还要注意,进程使用的虚拟内存与进程使用的RAM数量无关。
以下是您可以尝试检查线程的总堆栈的内容。
相关文章:
- 在 c++11 中为 pthread 设置调度参数
- 我如何测试代码没有调用 exit()
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- exit(0) 和 raise(SIGTERM) 有什么区别?
- pthread只有在线程数量较少时才可以正常工作
- "Program ended with exit code: 0"出现在我的输出的开头?
- pthread执行时间比顺序执行时间差
- 使用 -pthread 如何不违反 ODR 规则?
- 使用 pthread 的多线程
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- 锁定步进pthread互斥
- Pthread段错误,使用指向main中变量的指针
- pthread导致的内存泄漏
- GCC:--静态链接到pthread的整个存档配方在最近的GCC版本中停止工作
- exit(EXITT_FAILURE)在c和c++中是如何工作的
- 在C++中使用exit()退出程序有问题吗
- 正确地编写一个类,并将pthread与vlc库和c++一起使用
- 直接读取 pthread 互斥锁的所有者字段是否安全?
- 为什么 pthread 会减慢代码速度?