由两个线程类共享的 Posix pthread_cond_t不起作用
Posix pthread_cond_t shared by two thread classes doesn't work
我有两个类评估线程,但我无法从一个类发送到另一个类,为什么它不起作用的一些想法:
第 1 类:
#include "timer.h"
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "mutexy.h"
Timer::Timer() {
}
Timer::~Timer() {
}
void Timer::startThread() {
pthread_create(&thread, NULL, runInstance, reinterpret_cast<void *>(this));
}
void Timer::joinThread() {
pthread_join(thread, NULL);
}
void Timer::init() {
this->hh = 0;
this->day = 1;
this->month = 1;
this->year = 2011;
}
void Timer::run() {
while(true)
{
if(hh==24) {
hh = 0;
day++;
if(day==31) {
day=1;
month++;
if(month==13) {
year++;
month==1;
}
}
}
for (int i=0; i<10; i++) {
if(hh==7) {
hh=20;
pthread_cond_signal(&brak_biletow_treshold);
}
}
sleep(1);
hh++;
pthread_yield();
}
}
void* Timer::runInstance(void *instance) {
Timer *d = reinterpret_cast<Timer *>(instance);
d->run();
return NULL;
}
第2类:
#include "flight_list.h"
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "mutexy.h"
string cities[8] = {"Warszawa","Berlin","Paryz","Londyn","Dublin","Madryt","Wieden","Moskwa"};
FlightList::FlightList() {
srand(time(NULL));
}
FlightList::~FlightList() {
}
void FlightList::startThread() {
pthread_create(&thread, NULL, runInstance, reinterpret_cast<void *>(this));
}
void FlightList::joinThread() {
pthread_join(thread, NULL);
}
void FlightList::init() {
flightTab = new Flight *[10];
for (int i=0; i<10; i++) {
int city = rand()%7+1;
flightTab[i] = new Flight(i*2+2,i+2,1,2011,60,cities[0],cities[city]);
}
}
void FlightList::run() {
while(true)
{
pthread_mutex_lock(&bilety_mutex);
pthread_cond_wait(&brak_biletow_treshold, &bilety_mutex);
for (int i=0; i<10; i++) {
for(int i=0; i<9; i++)
flightTab[i] = flightTab[i+1];
int city = rand()%7+1;
flightTab[9] = new Flight(4,10,2,2011,60,cities[0],cities[city]);
}
pthread_mutex_unlock(&bilety_mutex);
pthread_yield();
}
}
void* FlightList::runInstance(void *instance) {
FlightList *d = reinterpret_cast<FlightList *>(instance);
d->run();
return NULL;
}
以及带有互斥锁和cond_t的头文件:
#include <pthread.h>
static pthread_mutex_t bilety_mutex;
static pthread_mutex_t loty_mutex;
static pthread_cond_t brak_biletow_treshold = PTHREAD_COND_INITIALIZER
;
互斥体正常工作,但线程 :S 未接收信号
每个翻译单元都有自己的brak_biletow_treshold
实例,因为您已将它们声明为static
(这有效地将范围限制为当前翻译单元(。
您需要更改声明和访问"全局变量"的方式。我建议你将条件传递给两个类的构造函数。
这是因为包含头文件的每个 C 源文件都会获得自己的静态变量副本。它们不会在翻译单元之间共享。
互斥体似乎只起作用,因为它们在这种情况下的操作是不会相互影响。对于互斥锁,它看起来一直工作到您的数据损坏为止。
对于条件变量,分离意味着它看起来不像在工作,实际上也不是。
一种解决方案是在头文件声明中将它们标记为extern
,并在某处的 C 文件中定义它们,如下所示:
my_thread_stuff.h:
extern pthread_mutex_t bilety_mutex;
extern pthread_mutex_t loty_mutex;
extern pthread_cond_t brak_biletow_treshold;
global_thread_stuff.c:
#include "my_thread_stuff.h"
pthread_mutex_t bilety_mutex;
pthread_mutex_t loty_mutex;
pthread_cond_t brak_biletow_treshold = PTHREAD_COND_INITIALIZER;
相关文章:
- 在 c++11 中为 pthread 设置调度参数
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- POSIX open() 挂在 SMB 共享上
- C/C++:POSIX 兼容方式查找默认网络接口上/下
- pthread只有在线程数量较少时才可以正常工作
- 使用Boost async_read和POSIX::stream_descriptor从键盘读取
- 没有信号处理程序的POSIX定时器的目的是什么?
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- pthread执行时间比顺序执行时间差
- 使用 -pthread 如何不违反 ODR 规则?
- 使用 pthread 的多线程
- 强大的 rwlock 在 posix
- 父进程和子进程之间的 POSIX 信号量
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- 锁定步进pthread互斥
- Posix 线程类和启动例程 (pthread)
- 如何在某个时间睡觉,以毫秒为单位,posix pthread
- 多次使用同一线程的 POSIX pthread
- 确定posix pthread的堆栈使用情况