2

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

创建一个不断循环的线程,提示用户输入一个整数。第二个线程休眠十秒,然后显示:迄今为止输入的最大值;. 然后它重新进入睡眠状态并重复。

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

这是到目前为止的代码

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;


}
4

2 回答 2

5

由于这似乎是家庭作业,因此我不会为您编写任何代码,但稍微分析一下可能会帮助您更好地理解这里的问题。

分解需求以及如何分析它?

您需要两个单独的线程,一个负责从用户接收变量并存储它,另一个线程每 10 秒唤醒一次并读取当前输入的值。
除了需要 2 个线程这一显而易见的事实之外,请注意对存储读取的强调,这意味着需要从两个不同的线程访问同一个变量,这告诉您它应该是一个全局变量。

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

此外,您需要在两个线程之间访问相同的全局变量,这意味着两个线程可以相互竞争以访问共享变量,因此您需要某种同步机制来避免这种情况。

上面的分析应该让您开始编程,尝试这样做,如果您遇到任何问题,请随时在此处提出问题,其中包含您尝试过的具体细节以及您面临的确切问题。

一切顺利 :)

于 2012-05-23T03:08:19.613 回答
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);
        }
    }
}

PS 我决定使用 -1 作为停止值,因为您没有提及程序何时或如何结束。

现在,您可以编写一个main()来启动这两个线程吗?

您可以在两个线程之间进行同步,以便它们不会同时从 g_i 读取和写入吗?

于 2012-05-23T03:12:31.950 回答