pthread_attr_setstacksize and pthread_exit

pthread_attr_setstacksize and pthread_exit

本文关键字:pthread exit and attr setstacksize      更新时间:2023-10-16

我有一个关于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, &param[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数量无关。

以下是您可以尝试检查线程的总堆栈的内容。