我在主程序中调用函数时遇到问题 这些功能必须在我的课堂上 如何从我的int main()访问它们?
#include <iostream>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <math.h>
#include <sys/types.h>
#include <semaphore.h>
#include <synch.h>
using namespace std;
class myCountingSemaphoreUsingBinarySemaphore {
public:
void waitSemaphore(pthread_mutex_t *thread)
{
pthread_mutex_lock(*thread);// Makes value 1 (Not Available)
}
void signalSemaphore(pthread_mutex_t *thread)
{
pthread_mutex_unlock(*thread); // Makes value 0 (Available)
}
void deleteSemaphore(pthread_mutex_t *thread)
{
pthread_mutex_destroy(*thread);// Deletes
}
};
int readerCount;
int database = (rand() / 100); // Number less than 1000
void reader_writer(void);
int main(int argc, char *argv[])
{
myCountingSemaphoreUsingBinarySemaphore obj;
pthread_mutex_t mutex1;
pthread_mutex_t wrt;
pthread_create( &mutex1, NULL, reader_writer, void);
pthread_create( &wrt, NULL, reader_writer, void);
//----------------------READER------------------------//
do{
cout << "Database Before Read = " << database << endl;
obj.waitSemaphore(mutex1);//lock
readerCount++;
if (readerCount == 1)
{
obj.waitSemaphore(wrt);//lock
obj.signalSemaphore(mutex1);//unlock
//reading is preformed
obj.waitSemaphore(mutex1); // lock
readerCount--;
}
if(readerCount == 0)
{
obj.signalSemaphore(wrt);//unlock
obj.signalSemaphore(mutex1); // unlock
}
cout << "Database After Read = " << database << endl;
}while (true);
//-----------------------WRITER---------------------//
do{
cout << "Database Before Write = " << database << endl;
obj.waitSemaphore(wrt);//lock
//writing is preformed
database = database + 10;
obj.signalSemaphore(mutex1);//unlock
cout << "Database After Write = " << database << endl;
}while(true);
pthread_join( mutex1, NULL);
pthread_join( wrt, NULL);
obj.deleteSemaphore(* mutex1);
obj.deleteSemaphore(* wrt);
return 0;
}
void reader_writer () {}
这是我得到的错误:
他们需要什么类型? pthread_mutex_t_create?还是pthread_t_create?
什么是正确的类型?
答案 0 :(得分:2)
类中的函数称为方法。您需要实例化该类的对象才能使用它的方法:
myCountingSemaphoreUsingBinarySemaphore obj; // obj is an instance of the class
obj.waitSemaphore(&mutex1);
obj.signalSemaphore(&mutex1);
修改强>
顺便说一句, pthread_create 和 pthread_join 取pthread_t*
而不是互斥锁!
int pthread_create(pthread_t* thread,
pthread_attr_t* attr,
void* (*start_routine)(void*),
void* arg);
答案 1 :(得分:1)
您可以将这些方法声明为静态或使用对象进行调用:
myCountingSemaphoreUsingBinarySemaphore s;
s.waitSemaphore(wrt);
答案 2 :(得分:1)
您只是在waitSemaphore
调用类方法而不创建myCountingSemaphoreUsingBinarySemaphore的对象。
您应首先创建对象。
myCountingSemaphoreUsingBinarySemaphore obj;
obj.waitSemaphore(mutex1);
答案 3 :(得分:1)
您创建的两个主题(通过reader_writer()
)不执行任何操作。 main()
只是进入第一个do
循环而无法离开。
此外,您似乎混淆了互斥锁,信号量和条件变量。函数名称使您看起来像是在尝试在类中实现条件变量。但是你将它构建为互斥锁的包装器。
最后,你打电话给pthread_mutex_lock()
等人。在pthread_t
上pthread_mutex_t
时,应该在{{1}}上调用这些函数。
可能还有其他错误,但这些错误确实会突然出现。基本上,您需要查看多线程编程,包括创建线程的方式以及它们的同步方式。
答案 4 :(得分:0)
您需要创建类(对象)的实例才能调用其成员函数。
在这个特定的代码中,成员函数没有理由成为实例,可能是静态的:
class foo{
public:
static void bar(int val)
{
//do something
}
};
int main()
{
foo::bar(10);
}
答案 5 :(得分:0)
karlphillip是对的,你需要传递指针而不是引用
顺便说一句,以下行也是错误的,pthread_create接受和pthread_t而不是pthread_mutex_tpthread_create(&amp; mutex1,NULL,reader_writer,void);
pthread_create(&amp; wrt,NULL,reader_writer,void);