同时执行队列中对象的功能时的奇怪行为

埃里克·纳(Eric Na)

我的程序有一个shared queue,并且大致分为两部分:

一个用于将class实例推request送到queue另一个用于访问中的多个request对象queue并处理这些对象。request是带有string req字段的非常简单的类(仅用于测试)

我正在研究第二部分,为此,我想保留一个scheduling thread和多个(在我的示例中为两个)executing threads

我想有一个单独的原因scheduling thread是数量减少lockunlock操作访问的queue多个executing threads

我正在使用pthread库,并且我的调度和执行函数如下所示:

void * sched(void* elem) {

    queue<request> *qr = static_cast<queue<request>*>(elem);

    pthread_t pt1, pt2;

    if(pthread_mutex_lock(&mut) == 0) {
        if(!qr->empty()) {
            int result1 = pthread_create(&pt1, NULL, execQueue, &(qr->front()));
            if (result1 != 0) cout << "error sched1" << endl;
qr->pop();
        }
        if(!qr->empty()) {
            int result2 = pthread_create(&pt2, NULL, execQueue, &(qr->front()));
            if (result2 != 0) cout << "error sched2" << endl;
qr->pop();
        }

        pthread_join(pt1, NULL);
        pthread_join(pt2, NULL);

        pthread_mutex_unlock(&mut);
    }

    return 0;
}

void * execQueue(void* elem) {

    request *r = static_cast<request*>(elem);
    cout << "req is: " << r->req << endl; // req is a string field

    return 0;
}

简单来说,每个execQueue线程都有一个要执行的线程,并且仅输出通过void* elem参数传递给它的请求

schedmain()通过一个线程在中调用(如果您想知道如何调用,则main()如下所示)

pthread_t schedpt;
int schresult = pthread_create(&schedpt, NULL, sched, &q);
if (schresult != 0) cout << "error sch" << endl;

pthread_join(schedpt, NULL);

sched函数本身创建多个(两个在这里)executing threadspop小号request从S queue,并执行request调用小号execQueue在多线程(在pthread_create,然后ptrhead_join)。

问题是程序的行为异常。

当我检查队列中的大小和元素而不创建线程并在多个线程上调用它们时,它们正是我所期望的。

但是,当我运行带有多个线程的程序时,它会打印出来

队列中有1个项目。队列中有2个项目。要求是:要求是:第一! (x' j| 1? rj|p rj|1 第一! 'j|! ' j| 'j|P ( ( (1 ? i|p i|

最后一行不断变化。

所需的输出是

队列中有1个项目。队列中有2个项目。要求是:第一要求是:第一

我猜想我是execQueue在多个线程上调用的方式,还是我pop()了的方式,但是我无法弄清楚问题,也找不到任何参考资料来正确使用。

请帮我。我是初学者,请耐心等待pthread的笨拙用法。

WhozCraig

您的队列包含对象,而不是对象的指针。您可以operator &()按原样通过寻址队列的最前面的对象,但是一旦弹出队列,该对象就消失了,该地址不再有效。当然,sched这无关紧要,但是execQueue发送该地址功能确实可以

您的代码最直接的解决方法是:

更改此:

pthread_create(&pt1, NULL, execQueue, &(qr->front()));

对此:

// send a dynamic *copy* of the front queue node to the thread
pthread_create(&pt1, NULL, execQueue, new request(qr->front()));

并且您的线程proc应该更改为:

void * execQueue(void* elem) 
{
    request *r = static_cast<request*>(elem);
    cout << "req is: " << r->req << endl; // req is a string field
    delete r;
    return nullptr;
}

也就是说,我可以想到更好的方法,但这应该解决您的紧迫问题,假设您的request对象类是可复制构造的,并且如果它具有动态成员,则遵循三个规则

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从窗口对象中删除属性时的奇怪行为

来自分类Dev

呼吁java.lang.reflect.Proxy对象扩展功能时科特林奇怪的行为

来自分类Dev

从列表中随机选择功能并测试其功能时的奇怪行为

来自分类Dev

缩放对象时非常奇怪的行为

来自分类Dev

缩放对象时的奇怪行为

来自分类Dev

Powershell-调用每个对象的函数会更改所有对象中的数组时的奇怪行为

来自分类Dev

C#中奇怪的COM对象行为

来自分类Dev

Json对象操作中的Javascript奇怪行为

来自分类Dev

“断言”功能:奇怪的行为

来自分类Dev

“断言”功能:奇怪的行为

来自分类Dev

从python中的列表继承时的奇怪行为

来自分类Dev

返回选项时mapValues中的奇怪行为

来自分类Dev

检查Alloy中的断言时的奇怪行为

来自分类Dev

在LowerCamelCase中命名变量时的奇怪行为

来自分类Dev

从R中的stdin读取时的奇怪行为

来自分类Dev

在viewDidLoad中调用addSubView时的奇怪行为

来自分类Dev

在 Pendrive 中传输文件时的奇怪行为

来自分类Dev

在Mac终端中同时使用lsof和awk的奇怪行为?

来自分类Dev

在Mac终端中同时使用lsof和awk的奇怪行为?

来自分类Dev

从 /etc/profile.d/ 执行脚本时的奇怪行为

来自分类Dev

奇怪的行为复制对象

来自分类Dev

动态对象的奇怪行为

来自分类Dev

比较DateTime对象和JODA时的奇怪行为

来自分类Dev

-ErrorAction从COM对象设置变量时的奇怪行为

来自分类Dev

带有替换功能的JSON.stringify中的奇怪行为

来自分类Dev

在C#中执行多线程活动的奇怪行为

来自分类Dev

在C#中执行多线程活动的奇怪行为

来自分类Dev

奇怪的窗口功能行为

来自分类Dev

“读取”系统功能的奇怪行为

Related 相关文章

热门标签

归档