C 我怎么能有更瘦的pthread?
我有一个非常基本的ncurses程序来监视机器统计数据并启动远程xterms。它整天坐在窗户上,帮助我选择一台负载不重的机器来工作。它工作得很好,我非常喜欢它。但是它真的很胖。我想,比需要的要胖得多 基本方案如下: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
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是线程感知的,并且专门为每个线程分配存储,否则在创建线程时不会造成额外的开销。