2009-09-04 72 views
1

嘿傢伙我想知道如果有人可以提供一些幫助。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); 
     } 
    } 

} 
+0

您發佈的代碼是無效的(酒吧是不是指針,但它的用法類似於一個)。當我們必須猜測代碼的實際外觀時,很難診斷您的問題。請發佈您的實際代碼。 – 2009-09-04 02:23:20

+0

@Employed - 你不能說'bar'是或不是什麼 - 如果我們在這個代碼前加上'typedef struct _bar * Bar',那麼'bar'肯定是一個指針。你說我們需要更多的代碼是正確的,但是在假設未發佈的代碼方面是錯誤的。 – 2009-09-04 02:31:55

+0

解決了這個問題,本來就是Bar *吧,添加了實際的代碼 – dekz 2009-09-04 03:05:05

回答

4

----剪斷,因爲它不再適用,反正沒有工作----

----剪掉一些,因爲它沒有不再適用,反正沒有工作----

,這是你的錯誤:

  addCar(_cp->queue.buffer[_cp->queue.index % MAX_QUEUE], &_cp); 

&_cp正在通過地址_cp,這是指向_cp的指針。但_cp已經是一個指針,所以你傳遞一個指針指向。將&_cp更改爲常規_cp,或將void addCar(char *car, void *arg)更改爲void addCar(char *car, void **arg)(並相應地編輯addCar())。任何一個都可以工作,但我會推薦第一個,因爲它更容易。

+0

更新了我的實際代碼,也修正了這個例子。 – dekz 2009-09-04 02:48:27

+0

((CarPark *)arg) - > parks.size = 1;似乎沒有區別 – dekz 2009-09-04 02:51:37

+0

他們都是爲了後來的功能,我已經實施了,但只是剝離它的基礎知識,爲什麼它不工作和問題在哪裏。 Wall Werror和Wextra,根本沒有提供太多幫助。我只是用void *,因爲我正在用其他方式測試它,你認爲這可能與問題有關嗎? – dekz 2009-09-04 03:23:51

1

你在addCar中用鎖定做的很好。你的問題在你沒有發佈的代碼中。如果沒有訪問權限,我不確定你的問題是什麼。我認爲,以下代碼是我寫的。如果我不得不猜測問題出在哪裏,我可以想象你沒有傳遞你想要更新的結構,而是將它複製過來。希望這可以幫助。

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

#define CAR_PARK_SIZE 10 
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(void *arg) 
{ 
CarPark *_cp = arg; 
pthread_mutex_lock(&mutex); 

sleep(1); 
printf("Trying to increase size\n"); 
_cp->parks.size = _cp->parks.size+1; 
printf("new size: %d\n", _cp->parks.size); 
pthread_mutex_unlock(&mutex); 
} 
#define NUM_THREADS 5 
int main() 
{ 
     pthread_t threads[NUM_THREADS]; 
     int rc; 
     long t; 
     CarPark c; 
     c.parks.size = 0; 
     pthread_mutex_init(&mutex, NULL); 
     for(t=0; t<NUM_THREADS; t++) 
     { 
       printf("In main: creating thread %ld\n", t); 
       rc = pthread_create(&threads[t], NULL, addCar, (void *)&c); 
       if (rc) 
       { 
         printf("ERROR; return code from pthread_create() is %d\n", rc); 
         exit(-1); 
       } 
     } 
     pthread_exit(NULL); 
     return 0; 
} 
+0

肯定+1努力。在沒有看到代碼的情況下,你做得和你一樣好。 – 2009-09-04 03:39:24