嘿傢伙我想知道如果有人可以提供一些幫助。C - 線程互斥和一般頭痛
我一直在試圖教自己的pthreads,並通過互斥鎖來使線程一起運行並使用相同的結構,而不讀取和寫入壞的數據。
我目前的問題是,
從我的線程函數,如果我叫那可能類似於下面的內容的輔助功能:
void foo(void *arg)
{
Bar *bar = arg;
pthread_mutex_lock(&mutex);
bar->something = 1;
pthread_mutex_unlock(&mutex);
}
這上面的helper方法似乎並不來「更新」結構。
但是,如果我在線程函數中運行相同的代碼,完全相同的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);
}
}
}
您發佈的代碼是無效的(酒吧是不是指針,但它的用法類似於一個)。當我們必須猜測代碼的實際外觀時,很難診斷您的問題。請發佈您的實際代碼。 – 2009-09-04 02:23:20
@Employed - 你不能說'bar'是或不是什麼 - 如果我們在這個代碼前加上'typedef struct _bar * Bar',那麼'bar'肯定是一個指針。你說我們需要更多的代碼是正確的,但是在假設未發佈的代碼方面是錯誤的。 – 2009-09-04 02:31:55
解決了這個問題,本來就是Bar *吧,添加了實際的代碼 – dekz 2009-09-04 03:05:05