【发布时间】:2010-11-25 12:00:55
【问题描述】:
大家好,我想知道是否有人可以提供一点帮助。
我一直在尝试自学 pthreads,然后使用互斥锁让线程一起运行并使用相同的结构,同时不会读取和写入不良数据。
我现在的问题是,
从我的线程函数中,如果我调用一个可能类似于以下内容的辅助函数:
void foo(void *arg)
{
Bar *bar = arg;
pthread_mutex_lock(&mutex);
bar->something = 1;
pthread_mutex_unlock(&mutex);
}
上面的这个辅助方法似乎没有“更新”结构。
但如果我在线程函数中运行相同的代码,完全相同的 4 行代码,那么这似乎可以工作。
我做错了什么?或者我该如何解决这个问题?如果有人也能提供一些阅读材料,那就完美了。
编辑:对不起,我的代码中有错字。
这是我用于结构的实际代码。
typedef struct {
char *buffer[CAR_PARK_SIZE];
char *arrival_time[CAR_PARK_SIZE];
int keep_running;
int size;
int index;
} CarStorage;
typedef struct {
CarStorage parks;
CarStorage queue;
int busy;
} CarPark;
pthread_mutex_t mutex;
void addCar(char *car, void *arg)
{
CarPark *_cp = arg;
pthread_mutex_lock(&mutex);
printf("Trying to increase size\n");
_cp->parks.size = _cp->parks.size+1;
pthread_mutex_unlock(&mutex);
}
如果 addCar 中相同的行在线程函数中,它会增加大小,如果它在这个辅助函数中,它不会。
这里是调用代码
void *carpark_t(void *arg)
{
CarPark *_cp = arg;
while (_cp->parks.keep_running)
{
if (_cp->queue.size > 0)
{
addCar(_cp->queue.buffer[_cp->queue.index % MAX_QUEUE], &_cp);
sleep(1);
}
else
{
printf("[C] no cars in queue\n");
sleep(5);
}
}
}
【问题讨论】:
-
您发布的代码无效(bar 不是指针,但它使用起来像一个)。当我们不得不猜测您的代码实际上是什么样子时,很难诊断您的问题。请发布您的实际代码。
-
@Employed - 你不能说
bar是或不是任何东西 - 如果我们在这段代码前面加上typedef struct _bar *Bar那么bar肯定是指针。您说我们需要更多代码是正确的,但假设有关尚未发布的代码的事情是错误的。 -
修复了这个问题,本来是 Bar *bar,添加了实际代码
-
第一印象是线程中的 CarPark 结构存在范围问题。你能展示一下线程本身的一些细节吗?