Использование функции класса в int main () - PullRequest
0 голосов
/ 11 апреля 2011

У меня проблемы с вызовом функций из основной программы.
Эти функции должны быть в моем классе.
Как я могу получить к ним доступ из моего 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 ]

2 голосов
/ 11 апреля 2011

Функции внутри класса называются методами. Вам нужно создать экземпляр объекта этого класса, чтобы иметь возможность использовать его методы:

myCountingSemaphoreUsingBinarySemaphore obj; // obj is an instance of the class

obj.waitSemaphore(&mutex1);

obj.signalSemaphore(&mutex1);

EDIT:

Кстати, pthread_create и pthread_join принимают pthread_t* а не мьютекс!

int pthread_create(pthread_t* thread, 
                   pthread_attr_t* attr, 
                   void* (*start_routine)(void*), 
                   void* arg);
1 голос
/ 11 апреля 2011

Два потока, которые вы создаете (через reader_writer()), ничего не делают. main() просто входит в первый цикл do без выхода.

Кроме того, вы, похоже, перепутали мьютекс, семафоры и переменные условия. Имена функций делают вид, что вы пытаетесь реализовать условные переменные в вашем классе. Но вы строите это как обертки для блокировки мьютекса.

И, наконец, вы звоните pthread_mutex_lock() и др. на pthread_t, когда эти функции должны вызываться на pthread_mutex_t.

Возможно, есть и другие ошибки, но они действительно выпадают. По сути, вам необходимо пересмотреть многопоточное программирование как с точки зрения того, как создаются потоки, так и с точки зрения их синхронизации.

1 голос
/ 11 апреля 2011

Вы вызываете методы класса как просто waitSemaphore без создания объекта myCountingSemaphoreUsingBinarySemaphore.

Сначала вы должны создать объект.

myCountingSemaphoreUsingBinarySemaphore obj;
obj.waitSemaphore(mutex1);
1 голос
/ 11 апреля 2011

Вы можете объявить эти методы как статические или использовать объект для выполнения вызовов:

myCountingSemaphoreUsingBinarySemaphore s;
s.waitSemaphore(wrt);
0 голосов
/ 11 апреля 2011

karlphillip был прав, вам нужно передать указатель вместо ссылки

Кстати, следующая строка также является ошибкой, pthread_create accept и pthread_t вместо pthread_mutex_t

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

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

0 голосов
/ 11 апреля 2011

Вам нужно создать экземпляр класса (объект) для вызова его функций-членов.

В этом конкретном коде функции-члены не имеют причин быть экземпляром и могут быть статическими:

class foo{
    public:

    static void bar(int val)
    {
    //do something
    }
    };

int main()
{
   foo::bar(10);
}
...