Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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?_C_Memory Management_Pthreads_Ncurses - Fatal编程技术网

C 我怎么能有更瘦的pthread?

C 我怎么能有更瘦的pthread?,c,memory-management,pthreads,ncurses,C,Memory Management,Pthreads,Ncurses,我有一个非常基本的ncurses程序来监视机器统计数据并启动远程xterms。它整天坐在窗户上,帮助我选择一台负载不重的机器来工作。它工作得很好,我非常喜欢它。但是它真的很胖。我想,比需要的要胖得多 基本方案如下: void * run(void * task) { // once per minute: popen( /* stats checking command */ ) // save output to global var p

我有一个非常基本的ncurses程序来监视机器统计数据并启动远程xterms。它整天坐在窗户上,帮助我选择一台负载不重的机器来工作。它工作得很好,我非常喜欢它。但是它真的很胖。我想,比需要的要胖得多

基本方案如下:

void * run(void * task) {
    // once per minute:
        popen( /* stats checking command */ )
        // save output to global var
        pclose
}

int main() {
    // setup ncurses with halfdelay
    for ( /* each machine */ ) 
        pthread_create(somethread, NULL, run, (void *)somestruct);
    while ( ( c = getch() ) != 'q' )
        for ( /* each machine */ ) 
            // print machine stats
        // maybe launch an xterm
    // die gracefully
}
如上所述,它工作得很好。问题是,每个线程都将所有的ncurses胡说八道塞进了私有内存,导致一个非常胖的进程浪费了大量的位

那么,问题是:如何重新编写或重新安排这个程序,使每个pthread不携带所有不必要的ncurses内容


附带问题:你真的得向我推销它,但有谁知道比ncurses更好的方法来做到这一点吗?我想要终端窗口中固定位置上的统计信息,而不是滚动文本。

每个线程都有所有ncurses胡说八道-这在您的代码示例中根本不清楚!代码中唯一需要ncurses胡说八道的部分是//打印机器统计数据,它不在线程代码中。你确定问题出在ncurses上吗?我想我不确定,不。我的假设是,每个线程基本上都在分叉父进程,并带走了很多线程自己的任务中没有用到的东西。此外,我还更新了代码,以便更清楚地了解线程在shell命令上使用popen来检查机器的统计信息。我可以肯定的是,每个线程都会增加进程的内存使用量~8mb。popen中有问题吗?@user340008:线程是非常重的对象。至少,在大多数系统上,它们必须为堆栈分配1-2MB的内存。如果你真的想变得轻量级,你应该使用一个事件驱动的架构,例如使用一个更高级别的接口来做同样的事情。线程的要点是,它们远没有分叉一个新进程那么重。它们只会在进程中创建一个新的执行线程、一个新堆栈和一些特定于线程的存储。它们与进程中的其他线程位于相同的地址空间中,因此它们可以访问所有相同的数据,而无需复制任何内容。除非ncurses是线程感知的,并且专门为每个线程分配存储,否则在创建线程时不会造成额外的开销。