使用int main()中的类函数

Using a class function in int main()

本文关键字:类函数 int main 使用      更新时间:2023-10-16

我在主程序中调用函数时遇到问题。
这些函数必须在我的类中。
我如何从我的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_createpthread_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);