Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pthread_attr_setstacksize和pthread_exit_C++_C_Linux_Multithreading - Fatal编程技术网

C++ pthread_attr_setstacksize和pthread_exit

C++ pthread_attr_setstacksize和pthread_exit,c++,c,linux,multithreading,C++,C,Linux,Multithreading,我有一个关于64Mb内存的嵌入式系统中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_setstac

我有一个关于64Mb内存的嵌入式系统中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);
因此,当线程启动时,它只使用100KB的虚拟内存。 但是当线程结束并调用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, &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("FINE\n");
    return EXIT_SUCCESS;

}
Main->

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, &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("FINE\n");
    return EXIT_SUCCESS;

}
int main(无效){
pthread_t IDthread[最大线程];
int参数[最大线程数];
int指针;
inti,keyb;
无效*stkaddr;
大小与堆叠大小;
放置(!!!线程测试!!!);
printf(“进程ID%d\n\n”,getpid());

对于(i=0;i而言,可接合或分离螺纹存在已知问题,引用手册:

只有当 已连接的终止可连接线程是其最后一个线程 资源释放回系统。当分离的线程 终止时,其资源将自动释放回 系统

可以使用以下方法使螺纹可拆卸:

pthread_attr_setdetachstate(3)

你的考试有一些问题。 首先,pthread_attr_setstacksize有以下文档:

堆栈大小属性确定将为使用thread attributes对象attr创建的线程分配的最小大小(以字节为单位)

因此,每个线程可以使用比您设置的更多的内存。但除此之外,线程还可以从操作系统分配内存作为堆栈使用。这也适用于主线程

因此,我认为没有办法通过查看top命令的结果来实现您想要的,因为这些信息只能从线程本身中看到

还要注意,进程使用的虚拟内存与进程使用的RAM量无关


您可以尝试检查线程的总堆栈。

在内存使用量增加时使用调试器并中断,以查看实际发生的情况。@timrau问题是线程只有以下代码:'printf(“线程%d stop\n”,*param);pthread_exit(0)'那么,没有什么需要调试的了……你能提供剩下的代码吗?你怎么知道在调用pthread_exit后内存在增加?它不能与主线程相关吗?@fhsilva我现在已经发布了代码。当你按“1”时它只会创建一个新线程,当你按“2”时它会发送一个信号…我看到在linux外壳上使用“TOP”提高了内存使用率谢谢,但我用的是:“pthread_attr_setdetachstate(&attr_test,pthread_CREATE_DETACHED);”不对吗?