在int main()中使用类函数

时间:2011-04-11 16:49:27

标签: c++ class unix g++ pthreads

我在主程序中调用函数时遇到问题 这些功能必须在我的课堂上 如何从我的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?
什么是正确的类型?

6 个答案:

答案 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_tpthread_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_t

  

pthread_create(&amp; mutex1,NULL,reader_writer,void);

     

pthread_create(&amp; wrt,NULL,reader_writer,void);