Использование функции класса в int main()

#c #class #unix #g #pthreads

#c #класс #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( amp;mutex1, NULL, reader_writer, void);  
    pthread_create( amp;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?
каков правильный тип?

Комментарии:

1. Не могли бы вы, пожалуйста, сократить свой пример или, по крайней мере, добавить ошибку, которую вы получаете

2. Итак, с какой именно строкой у вас возникли проблемы? Или где бы вы хотели вызвать какую функцию?

3. Я надеюсь, что ваш компилятор не принимает это. pthread_t — это тип потока, а не тип мьютекса. Вы ищете pthread_mutex_t . man pthreads .

4. @ohlegend, ты этого не делаешь. pthread_t представляет поток. pthread_mutex_t представляет собой мьютекс. pthread_cond_t представляет собой переменную условия. Похоже, вы путаете эти понятия. Я рекомендую вам прочитать больше об этих концепциях в целом, а затем следовать некоторому руководству по pthreads в частности.

5. Вы создаете поток не с помощью pthreads_mutex_t, а с помощью pthread_create. Пожалуйста, лучше прочитайте какое-нибудь руководство по pthread и создайте несколько простых примеров, прежде чем приступить к написанию своего проекта. Этот урок выглядит красиво computing.llnl.gov/tutorials/pthreads

Ответ №1:

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

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

obj.waitSemaphore(amp;mutex1);

obj.signalSemaphore(amp;mutex1);
  

Редактировать:

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

 int pthread_create(pthread_t* thread, 
                   pthread_attr_t* attr, 
                   void* (*start_routine)(void*), 
                   void* arg);
  

Комментарии:

1. когда я делаю это, я получаю: Source1.cpp: 77: ошибка: нет соответствующей функции для вызова ‘myCountingSemaphoreUsingBinarySemaphore::deleteSemaphore (pthread_mutex_tamp;)’

2. Когда вы вызываете метод внутри main(), вы не передаете указатель на мьютекс, вы передаете сам мьютекс. Вы должны сделать это как obj.deleteSemaphore(amp;mutex1); вместо obj.deleteSemaphore(mutex1);

3. Ваши функции принимают pthread_mutex_t* , указатель. Вы пытаетесь передать ссылку, для передачи используется указатель (amp;mutex1) .

4. Вам действительно нужно прочитать руководство по pthread , прежде чем идти дальше: amparo.net/ce155/thread-ex.html

5. @ohlegend Кстати, на все ваши вопросы уже были даны ответы. Подумайте о принятии ответа! Если у вас есть еще какие-либо вопросы, мы будем рады ответить на них в другой теме.

Ответ №2:

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

 myCountingSemaphoreUsingBinarySemaphore s;
s.waitSemaphore(wrt);
  

Ответ №3:

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

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

 myCountingSemaphoreUsingBinarySemaphore obj;
obj.waitSemaphore(mutex1);
  

Ответ №4:

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

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

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

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

Комментарии:

1. @ohlegend, pthread_mutex_t это мьютекс, а не поток. Вероятно, вам следует прочитать руководство, на которое ссылается Zuljin.

2. @ohlegend pthread_mutex_t предназначен для мьютекса . Поток представлен pthread_t . Вам действительно нужно прочитать руководство по потокам.

Ответ №5:

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

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

 class foo{
    public:

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

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

Комментарии:

1. Пожалуйста, напишите выходные данные компилятора.

2. Кстати, у вас действительно есть причина собирать эти функции в классе?

Ответ №6:

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

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

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

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

Комментарии:

1. какого типа они должны быть? pthread_mutex_t_create? или pthread_t_create?