- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我添加了一个 Mutex 类以遵守 RAII。我不确定我使用它的方式是否正确。
队列被生产者锁定后,程序意外结束。
MutexClass.h
#ifndef MUTEXCLASS
#define MUTEXCLASS
#include <pthread.h>
class MutexClass
{
private:
pthread_mutex_t & _mutexVariable;
public:
MutexClass (pthread_mutex_t &);
~MutexClass ();
};
#endif // MUTEXCLASS
MutexClass.cpp
#include "mutexClass.h"
#include <stdexcept>
MutexClass::MutexClass (pthread_mutex_t & arg) : _mutexVariable (arg)
{
_mutexVariable = PTHREAD_MUTEX_INITIALIZER;
int returnValue = pthread_mutex_lock (&_mutexVariable);
if (returnValue > 0)
{
throw std::logic_error ("Mutex couldn't be locked!");
}
}
MutexClass::~MutexClass()
{
pthread_mutex_unlock (&_mutexVariable);
}
这是 main.cpp,我在其中使用上面定义的互斥类的对象。
Qt 的类在这里是为了同名,因为我是 Qt Creator。请忽略它们。
#include "mainwindow.h"
#include <QApplication>
#include <stdexcept>
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <iostream>
#include <QDebug>
#include "mutexClass.h"
pthread_mutex_t mutexVariable;
pthread_cond_t conditionVariable;
int numberOfActiveProducers;
int numberOfActiveConsumers;
QList <int> sharedQueueA;
QList <int> sharedQueueB;
/*
* Shared queues are supposed to be shared among four threads. Two producer, and two consumer threads.
* Producer threads will put the 1's in it, and Consumer threads will remove the 1's.
* Assumption: `sharedQueue` can contain only 10 elements at a time.
*/
int sizeOfSharedQueue;
void checkForSpaceAndPush (QList <int> & argList, int listId, pthread_t argTId)
{
std::cerr << "\nQueue " << listId << ", First check by Producer: " << argTId;
if (argList.length () < sizeOfSharedQueue + 1)
{
{
MutexClass mutex1 (mutexVariable);
std::cerr << "\n\nQueue " << listId << ", Locked by Producer: " << argTId;
if (argList.length () < sizeOfSharedQueue + 1)
{
argList.push_back (1); std::cerr << "\nPushed by Producer " << argTId << ": " << "Length of queue " << listId << " is: " << argList.length ();
}
else
{
std::cerr << "\nProducer " << argTId << ". Queue " << listId << " is full. Length of queue is: " << argList.length ();
pthread_cond_wait (&conditionVariable, &mutexVariable);
}
}
std::cerr << "\n\nQueue " << listId << ", UnLocked by Producer: " << argTId;
}
}
void checkForSpaceAndPop (QList <int> & argList, int listId, pthread_t argTId)
{
std::cerr << "\nQueue " << listId << ", First check by Consumer: " << argTId;
if (argList.length () > 0)
{
{
MutexClass mutex1 (mutexVariable);
std::cerr << "\n\nQueue " << listId << ", Locked by Consumer: " << argTId;
if (argList.length () > 0)
{
argList.pop_front (); std::cerr << "\nRemoved by Consumer: " << argTId << ", Length of queue " << listId << " is: " << argList.length ();
}
else
{
pthread_cond_signal (&conditionVariable); std::cerr << "\nSignal issued by Consumer: " << argTId << ", Length of queue " << listId << " is: " << argList.length ();
}
}
std::cerr << "\n\nQueue " << listId << ", UnLocked by Consumer: " << argTId;
}
}
// This function is run by the `Producer` threads.
void *producerThreadFunction (void *arg)
{
Q_UNUSED (arg);
while (1)
{
pthread_t tId = pthread_self(); std::cerr << "\nProducers: " << tId; std::cerr.flush();
checkForSpaceAndPush (sharedQueueA, 1, tId);
checkForSpaceAndPush (sharedQueueB, 2, tId);
}
return NULL;
}
// This function is run by the `Consumer` threads.
void *consumerThreadFunction (void *arg)
{
Q_UNUSED (arg);
while (1)
{
pthread_t tId = pthread_self (); std::cerr << "\nConsumer: " << tId; std::cerr.flush();
checkForSpaceAndPop (sharedQueueA, 1, tId);
checkForSpaceAndPop (sharedQueueB, 2, tId);
}
return NULL;
}
int main (int argc, char *argv[])
{
numberOfActiveProducers = 2;
numberOfActiveConsumers = 2;
sizeOfSharedQueue = 10;
// Producer threads creation
pthread_t producerA;
pthread_t producerB;
if (pthread_create (&producerA, NULL, producerThreadFunction, NULL)) {
fprintf (stderr, "Error creating thread Producer A\n");
return 1;
}
if (pthread_create (&producerB, NULL, producerThreadFunction, NULL)) {
fprintf (stderr, "Error creating thread Producer B\n");
return 1;
}
// Consumer threads creation
pthread_t consumerA;
pthread_t consumerB;
if (pthread_create (&consumerA, NULL, consumerThreadFunction, NULL)) {
fprintf (stderr, "Error creating thread Consumer A\n");
return 1;
}
if (pthread_create (&consumerB, NULL, consumerThreadFunction, NULL)) {
fprintf (stderr, "Error creating thread Consumer B\n");
return 1;
}
// Joining every thread
if (pthread_join (producerA, NULL)) {
fprintf (stderr, "Error joining thread Producer A\n");
return 2;
}
if (pthread_join (producerB, NULL)) {
fprintf (stderr, "Error joining thread Producer B\n");
return 2;
}
if (pthread_join (consumerB, NULL)) {
fprintf (stderr, "Error joining thread Consumer B\n");
return 2;
}
if (pthread_join (consumerA, NULL)) {
fprintf (stderr, "Error joining thread Consumer A\n");
return 2;
}
QApplication a (argc, argv);
MainWindow w;
w.show ();
return a.exec ();
}
输出在这里:
...
...
Queue 140388157085440
Removed by Consumer: 1403881570854401403881654781442
Queue , Locked by Consumer: 1140388148692736
Removed by Consumer: , Length of queue 1 is: , First check by Producer: 140388148692736, Length of queue 2 is: 1403881654781449
Queue
Queue 2, UnLocked by Consumer: 140388148692736
Consumer: 9
Queue 1, UnLocked by Consumer: 140388157085440
Queue 2, First check by Consumer: 1403881570854401140388148692736
Queue 1, First check by Consumer: 140388148692736
Queue , Locked by Producer:
Queue 2, Locked by Consumer: 140388157085440
Removed by Consumer: 1403881654781441, Locked by Consumer: 140388148692736
Pushed by Producer 140388165478144: Length of queue 1 is: 10
Queue 1, UnLocked by Producer: 140388165478144
Queue 2, First check by Producer: 140388165478144
Queue 2, Locked by Producer: 140388165478144The program has unexpectedly finished.
另外,请注意输出的以下部分:
Queue 2, Locked by Consumer: 140388157085440 Removed by Consumer: 1403881654781441, Locked by Consumer: 140388148692736
我只创建了 2 个消费者,但这里显示的 pids 是 3。为什么会这样?
最佳答案
目前,每次创建新构造一个新的 MutexClass
时,您都会将 mutexVariable
初始化为 PTHREAD_MUTEX_INITIALIZER
。考虑如果线程 A 持有 mutexVariable
并且线程 B 想要获取互斥量会发生什么:
thread A tries to lock mutexVariable and succeeds
mutexVariable = PTHRAED_MUTEX_INITIALIZER
pthread_mutex_lock(mutexVariable)
thread B tries to lock mutexVariable and succeeds
// this assignment overwrites the locked state thread A has stored
mutexVariable = PTHRAED_MUTEX_INITIALIZER
// mutex is default-initialized (not locked) - so lock it
pthread_mutex_lock(mutexVariable)
// both threads now believe they have the mutex
// and all syncronization is lost
thread B unlocks mutexVariable
// succeeds
thread A unlocks mutexVariable
// uh.. it is not even locked any more?!
你应该只在 main.cpp:13
中初始化一次 mutexVariable
:
pthread_mutex_t mutexVariable = PTHRAED_MUTEX_INITIALIZER;
并从 MutexClass
中删除初始化。
不确定这是否会解决您的所有问题,但这是我首先要做的事情。
关于c++ - 我定义的 Mutex 类中的逻辑错误以及我在生产者消费者程序中使用它的方式 - pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34544833/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!