使用int main()中的类函数
Using a class function in int main()
我在主程序中调用函数时遇到问题。
这些函数必须在我的类中。
我如何从我的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 ?
合适的类型是什么?
类中的函数称为方法。您需要实例化该类的对象,以便能够使用它的方法:
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);
可以将这些方法声明为静态方法,也可以使用对象来调用:
myCountingSemaphoreUsingBinarySemaphore s;
s.waitSemaphore(wrt);
您调用类方法只是waitSemaphore
没有创建myCountingSemaphoreUsingBinarySemaphore的对象。
你应该先创建对象。
myCountingSemaphoreUsingBinarySemaphore obj;
obj.waitSemaphore(mutex1);
您创建的两个线程(通过reader_writer()
)什么都不做。main()
只是进入第一个do
循环,没有办法出来。
另外,你似乎混淆了互斥锁、信号量和条件变量。函数名使它看起来像您试图在类中实现条件变量。但是你只是把它构建为互斥锁的包装器。
最后,你在pthread_t
上调用pthread_mutex_lock()
等函数,而这些函数应该在pthread_mutex_t
上调用。
可能还有其他错误,但这些是真正突出的错误。基本上,您需要回顾多线程编程,包括如何创建线程和如何同步线程。
为了调用该类的成员函数,需要创建该类的实例(对象)。
在这个特定的代码中,成员函数没有理由是实例,可以是静态的:
class foo{
public:
static void bar(int val)
{
//do something
}
};
int main()
{
foo::bar(10);
}
karlphillip是对的,你需要传递指针而不是引用
BTW,下面的行也是错误的,pthread_create接受pthread_t而不是pthread_mutex_t
pthread_create(&mutex1, NULL, reader_writer, void);
pthread_create(&wrt, NULL, reader_writer, void);
- 如何通过派生类函数更改基类中的向量
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 在类函数中初始化外部作用域变量
- c++ 在非类函数中使用类变量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 从类成员函数到类 C 函数指针的转换
- 如何在模板类函数中分配结构值?
- 有没有办法将重载的类函数绑定到函数对象?
- 启动类函数作为失去引用的线程
- C++调用使用重写函数的父类函数
- 将值传递到另一个类函数在打印时为零
- 计算对类函数的所有调用次数
- 由于签名差异,调用了错误的子类函数
- 使用宏调用类函数
- 虚拟基类函数中派生类的大小
- 模板类/函数中的交叉前向声明
- 在C++中使用非静态类函数的函数
- 构造函数无法访问继承类私有 int
- 不被类函数改变的私有int值
- 使用int main()中的类函数