我对嵌入式系统中的C并发编程有一个大约64Mb Ram的问题。 特别是,我想减少Thread使用的默认内存,所以我定义了:
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);
因此,当线程启动时,它只使用100Kbyte的虚拟内存。 但是当线程结束并调用pthread_exit时,进程使用的虚拟内存会迅速增加!....
为什么呢?我该怎么办?
谢谢!
更新:
主题 - >
void *thread_test(void *arg1) {
int *param;
param = (int*)arg1;
printf("Thread %d start\n", *param);
pthread_cond_wait(&condition[*param], &mutex[*param]);
printf("Thread %d stop\n",*param);
pthread_exit(0);
}
主要 - >
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 %d\n\n", 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("FINE\n");
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
可加入或已分离的线程存在已知问题,请参阅手册:
只有当一个 终止的可加入线程已加入其中的最后一个 资源释放回系统。当一个分离的线程 终止后,它的资源会自动释放回来 系统
您可以通过以下方式使线程可拆卸:
pthread_attr_setdetachstate(3)
答案 1 :(得分:0)
您的测试存在一些问题。 首先,pthread_attr_setstacksize具有以下文档:
堆栈大小属性确定将为使用线程属性对象attr创建的线程分配的最小大小(以字节为单位)。
因此每个线程可以使用比您设置的更多的线程。但更重要的是,线程可以从OS分配内存以用作堆栈。这也适用于主线程。
因此,我不认为有办法通过查看top命令的结果来实现你想要的东西,因为这些信息只能从线程本身中看到。
另请注意,进程使用的虚拟内存与进程使用的RAM量无关。
Here可以尝试检查线程的总堆栈。