我的程序有一个 shared queue
,主要分为两部分:
一个用于将类的实例推request
送到queue
,另一个访问request
中的多个对象queue
并处理这些对象。request
是一个非常简单的类(仅用于测试),带有一个string req
字段。
我正在研究第二部分,在此过程中,我想保留一个scheduling thread
和多个(在我的示例中为两个)executing threads
。
我想要一个单独的原因scheduling thread
是为了减少访问的数量lock
和unlock
操作queue
by multiple 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
参数传递给它的请求。
sched
使用线程调用 in main()
(如果您想知道如何调用,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 threads
和pop
s request
,并通过调用多个线程(pthread_create 然后 ptrhead_join)来queue
执行s。request
execQueue
问题是程序的奇怪行为。
当我检查队列中的大小和元素而不创建线程并在多个线程上调用它们时,它们正是我所期望的。
但是,当我用多个线程运行程序时,它会打印出来
1 个项目在队列中。2 个项目在队列中。req 是:req 是:FIRST!��(x'�j|1��rj|p�rj|1����第一个!”'�j|!�'�j|�'�j| P��(�(��(1� ��i|p��i|
最后一行不断变化。
所需的输出是
1 个项目在队列中。2 个项目在队列中。req 是:FIRST req 是:FIRST
我想要么是我execQueue
在多个线程上调用的方式,要么是我pop()
错的方式,但我无法找出问题所在,也找不到任何来源来参考正确用法。
请帮助我。忍受我笨拙地使用 pthread,因为我是初学者。