#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?