Я немного не понимаю, как передать объект функции pthread_create. Я нашел много разрозненной информации о приведении к типу void*, передаче аргументов в pthread_create и т. д., но ничего, что связывало бы все это воедино. Я просто хочу убедиться, что связал все это вместе и не делаю глупостей. Допустим, у меня есть следующий класс потока: Изменить: исправлено несоответствие static_cast
.
class ProducerThread {
pthread_t thread;
pthread_attr_t thread_attr;
ProducerThread(const ProducerThread& x);
ProducerThread& operator= (const ProducerThread& x);
virtual void *thread_routine(void *arg) {
ProtectedBuffer<int> *buffer = static_cast<ProtectedBuffer<int> *> arg;
int randomdata;
while(1) {
randomdata = RandomDataGen();
buffer->push_back(randomdata);
}
pthread_exit();
}
public:
ProtectedBuffer<int> buffer;
ProducerThread() {
int err_chk;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);
err_chk = pthread_create(&thread, &thread_attr, thread_routine, static_cast<void *> arg);
if (err_chk != 0) {
throw ThreadException(err_chk);
}
}
~ProducerThread() {
pthread_cancel(&thread);
pthread_attr_destroy(&thread_attr);
}
}
Чтобы уточнить, к данным в классе ProtectedBuffer
можно получить доступ только с помощью таких методов, как ProtectedBuffer::push_back(int arg)
, которые используют мьютексы для защиты фактических данных.
Мой главный вопрос: правильно ли я использую static_cast
? И мой второстепенный вопрос: нужна ли мне эта первая строка в virtual void *thread_routine(void *arg)
, где я копирую переданный указатель void в указатель на ProtectedBuffer
?
Кроме того, если я сделал что-то еще, что может вызвать проблемы, я был бы признателен за это.
this
класса потока может быть аргументом процедуры потока, предоставляя состояние для процедуры потока. Согласовано.) - person jxh   schedule 08.08.2012extern "C"
, и любая спецификация компоновки игнорируется в функциях-членах. (Стандарт требует диагностики, но есть некоторые сломанные компиляторы, которые не могут обнаружить ошибку.) - person James Kanze   schedule 08.08.2012