C - ncurses和两个并发线程

时间:2015-08-17 22:33:20

标签: c concurrency pthreads screen ncurses

这个程序应该是一个简单的尝试来运行两个需要在同一个屏幕上写入的并发线程。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <pthread.h>
#include <ncurses.h>

void *function1(void *arg1);
void *function2(void *arg2);

int main(int argc, char *argv[])
{
    printf("hello");

    initscr();
    printw("screen on\n");

    pthread_t function1t;
    pthread_t function2t;

    if( pthread_create( &function1t, NULL, function1, NULL) < 0)
    {
    printw("could not create thread 1");
    return 1;
    }

    if( pthread_create( &function2t, NULL, function2, NULL) < 0)
    {
    printw("could not create thread 2");
    return 1;
    }

    endwin();
    return 0;
}

void *function1(void *arg1)
{
    printw("Thread 1\n");
    while(1);
}

void *function2(void *arg2)
{
    printw("Thread 2\n");
    while(1);
}

但它开始时甚至不打印hello。怎么了?如何在这样的程序中处理一个独特的屏幕,有两个线程?

更新:在refresh();之后放置printw会产生以下输出

screen on



Thread 1

Thread 2

$

其中$是提示。因此,该程序打印字符串,但它(显然)随机地放置一些意外的换行符并且结束。由于两个线程中的while(1)指令,它不应该!

2 个答案:

答案 0 :(得分:1)

不会打印hello字符串,但会使用initscr()指令快速清除它:

  

initscr代码确定终端类型并初始化所有   诅咒数据结构。 initscr也会导致第一次调用刷新   清除屏幕。如果发生错误,initscr会写一个合适的错误   标准错误和退出的错误消息;否则,指针是   回到了stdscr。

printw按预期打印,因为您没有刷新。您应该在每个refresh()之后使用printw

printw("screen on\n");
refresh();

答案 1 :(得分:0)

正常配置中的curses / ncurses不支持线程, 的建议一直是在单个线程中运行curses。从ncurses 5.7开始,如果配置库(编译时)以使用互斥锁和其他入口点,则对线程应用程序提供了基本的支持。

关于互斥体,几乎所有关于POSIX线程的教程都涵盖了这一点。以下是一个示例:POSIX Threads Programming