当前位置: 首页 > 知识库问答 >
问题:

无限循环多线程

郎成弘
2023-03-14

我已经写了这个生产者/消费者问题解决方案。它似乎在工作,而不是无限循环。我的印象是,pthread\u exit(NULL) 会让它停止,但老实说,我已经迷路了。有人能告诉我如何阻止循环的正确方向吗?

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<iostream>
#include<semaphore.h>

#define BUFFSIZE 10

using namespace std;

int buffer[BUFFSIZE];
int size; //current buffer size
int n = 0, m = 0;

pthread_mutex_t Mutex = PTHREAD_MUTEX_INITIALIZER;

sem_t Available;
sem_t Buffer; //indicates if buffer is full

//----------------------------------------------------------------//

void *Consumers(void *argument)
{
    int con_id = *((int *) argument);
    while(1)
    {
        if(size == 0)
        {
            cout << "Queue is empty." << endl;
        }

        sem_wait(&Available);
        pthread_mutex_lock(&Mutex);

        size--;
        cout << "Con " << con_id << ": Product removed from buffer" << endl;
        //for(int i = 0; i < size; i++)
        //{
        //  cout << Buffer[i] << " ";
        //}
        cout << endl;
        pthread_mutex_unlock(&Mutex);
        sem_post(&Buffer);
    }
    return(NULL);
}

//----------------------------------------------------------------//

void *Producers(void *argument)
{
    int item = 8;
    int pro_id = *((int *) argument);

    while(1)
    {
        sem_wait(&Buffer);
        pthread_mutex_lock(&Mutex);
        //Buffer[size] = item;
        cout << "Item added" << endl;
        size++;
        pthread_mutex_unlock(&Mutex);
        sem_post(&Available);
    }
    return(NULL);
}

//----------------------------------------------------------------//

int main()
{

    cout << "Enter number of producers: " << endl;
    scanf("%d", &n);
    cout << "Enter number of consumers: " << endl;
    scanf("%d", &m);
    //get number of producers(int n), and consumers(int m)
    sem_init(&Available, 0, 0);
    sem_init(&Buffer, 0, BUFFSIZE);

    pthread_t *con = new pthread_t[m];
    int *thread_args_c = new int[m];
    for(int i = 0; i < n; i++)
    {
        thread_args_c[i] = i;
        pthread_create(&con[i], NULL, Consumers, (void*) &i);
    }

    pthread_t *pro = new pthread_t[n];
    int *thread_args_p = new int[n];
    for(int i = 0; i < n; i++)
    {
        thread_args_p[i] = i;
        pthread_create(&pro[i], NULL, Producers, (void*) &i);
        pthread_join(con[i], NULL);
    }

    pthread_exit(NULL);

}

共有2个答案

阮才俊
2023-03-14

循环不会停止,因为代码中没有实际退出循环的逻辑。

进程被卡住,因为pthread\u join会挂起调用线程,直到目标退出。请参阅pthread\u join文档

如果不关心实际终止线程并返回主线程,只需删除对pthread\u join的调用即可。进程应该终止,因为主线程已退出。

要真正正确终止循环,您需要设置一个内部或外部触发器。您可以在内部让循环在一定次数的迭代后退出。为此,您将执行而(x

您还可以使其更加复杂,并让主线程在外部向其他线程发出信号,表示它希望其他线程关闭。当您准备退出时,您可以让主线程设置一个(易失性)布尔值,并让其他线程中断基于它的循环。如果您关心退出的原子性,您需要使用锁来保护布尔值。

全丰
2023-03-14

pthread_exit出现在main的末尾(并且完全不需要,因为main正在退出),但是您在线程中的无限循环永远不会让main到达这一点(因为您正在加入消费者线程)。

此外,您的创建和加入模型也很有意义——在创建了制作人之后加入消费者线程有什么意义?

最后,但不是租约,您未能加入生产者线程。

 类似资料:
  • 问题内容: 由于某种原因,当我在路由中拥有动态属性并访问该页面时,我陷入了无限循环,该页面将不断请求自己。 我正在查看的路由是/ userlists /:id路由。该路由的控制器是- 当我访问/ userlists / 9时,我看到- 每3秒被记录一次,页面冻结。只要位置后面有一个斜杠(“ / userslists /”而不是“ / userlists”),就好像发生了这种情况。 有人知道原因吗?

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 我正在尝试编写一个线程,该线程将在我的主程序的后台运行,并监视某些内容。在某个时候,主程序应该向线程发出安全退出的信号。下面是一个以固定间隔将本地时间写入命令行的最小示例。 当“on”变量没有通过引用传递时,此代码会编译并产生预期的结果,只是线程永远不会终止。一旦变量通过引用传递,我就会收到编译器错误 您能建议一种修复此代码的方法吗? 额外的问题:哪里出了问题,为什么它可以与std::ref一起工

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在Sense hat的显示器上显示并保持更新。然而,我想要的能力,开关时钟与操纵杆中间。一切都很好,除了我的时钟的更新循环阻止任何新的输入一旦启动。 我一直在考虑如何解决这个问题。如何允许脚本/时钟保持运行,并且仍然接受来自操纵杆的新操作。但是一旦while循环开始,我就卡住了。我不知道该用谷歌搜索什么。我已经开始研究async/await,