C中的多线程

时间:2012-05-23 02:16:56

标签: c multithreading pthreads

我正在尝试为以下代码编写但是徒劳无功。有人可以帮忙吗?

创建一个连续循环的线程,提示用户输入一个整数。第二个线程休眠十秒钟,然后显示:到目前为止输入的最大值; 。然后它重新入睡并重复。

我非常困惑和困惑。有人可以帮忙吗

这是到目前为止的代码

pthread_create(&thread1, NULL, &inputfunction, NULL);
        pthread_create(&thread2,NULL, &inputfunction, NULL);
        pthread_join(thread1,NULL);
       // pthread_join(thread2,NULL);
//        pthread_mutex_init(&array_lock, NULL);
        return 0;
}

void *inputfunction()
{
        //int *values= ptr_value;
        int i;
        int arr[5];
        printf("Input values:");
        for (i=0;i<5;i++)
        scanf("%d",&arr[i]);
        sleep(10);

        int max=0;
        for (i=0;i<5;i++)
                {
                        if (arr[i]>max)
                                max=arr[i];
                }
        printf("max=",max);

        return NULL;


}

2 个答案:

答案 0 :(得分:5)

由于这似乎是作业,我不会给你写任何代码,但是一些分析可能会帮助你更好地理解这个问题。

打破要求&amp;如何分析?

你需要两个独立的线程,一个用于接收来自用户的变量, 存储 ,另一个线程每隔10秒唤醒一次< strong> 读取 当前输入的值 除了明显的事实,你需要2个线程注意强调 存储 &amp; 阅读 ,它意味着需要从两个不同的线程访问相同的变量,这两个线程告诉您它应该是一个全局变量。

您当前的代码有什么问题?
你有两个线程可以,但你需要两个不同的线程函数,因为你需要在两个线程中执行不同的活动。因此,你不能为两个线程重用相同的函数inputfunction()。你需要两个不同的功能&amp;我们已经在Q的第一部分详细说明了每个函数应该做什么 提示:查看环境文档(Windows / Linux等)以获取计时器,并将自己的函数注册为回调函数,这实际上可以简化完全生成单独线程的需要。

此外,您需要在两个线程之间访问相同的全局变量,这意味着两个线程之间可以 race 来访问共享变量,因此您需要某种<强> synchronization mechanism 以避免这种情况。

上述分析应该让您开始编程,尝试这样做,如果您遇到任何问题,请随时在这里提出一个问题,详细说明您尝试过的内容以及您面临的确切问题。

一切顺利:)

答案 1 :(得分:2)

您只编写了一个模糊第一个线程和第二个线程之间的线路的函数。

  • 它只循环5次(在说明书中没有要求!)
  • 它读取输入(第一个线程的一部分)
  • 它睡觉(线程二的一部分)
  • 它维护一个包含5个整数的数组(在说明中没有被要求!)

如果您只是按照说明操作,那么您将会更进一步:

创建一个连续循环的线程,提示用户输入一个整数。

/* global */  int g_i;

void Thread_One_Main(void)
{
    g_i = 0;
    while( g_i != -1)
    {
        scanf("%d", &g_i);
    }
}

第二个线程休眠十秒钟,然后显示到目前为止输入的最大值 然后它又回到睡眠状态并重复。

void Thread_Two_Main(void)
{
    int max = 0;
    while(g_i != -1)
    {
        sleep(10);
        if (g_i > max)
        {
            max = g_i;
            printf("New max value: %d\n", max);
        }
    }
}

P.S。我决定使用-1作为停止值,因为你没有提到关于程序何时或如何结束的任何内容。

现在,你能写一个main()来启动这两个线程吗?

你可以在两个线程之间进行同步,这样它们就不会同时从g_i读写吗?