1

やあみんな私は誰かが少し助けを提供できるかどうか疑問に思っていました。

私は自分自身にpthreadを教えようとしてきましたが、それを使用して、不正なデータの読み取りと書き込みを行わずに、スレッドを一緒に実行して同じ構造を使用するようにミューテックスロックを使用します。

現時点での私の問題は、

スレッド関数から、次のようなヘルパー関数を呼び出すと、次のようになります。

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);
        }
    }

}
4

2 に答える 2

4

----適用されなくなり、とにかく機能しなくなったため、削除されました----

----適用されなくなり、とにかく機能しなくなったため、もう少し切り取った----

そして、ここにあなたのエラーがあります:

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

これは、へのポインタであるのアドレスを&_cp渡すことです。しかし、すでにポインタであるため、ポインタをポインタに渡します。通常に変更するか、に変更します(それに応じて編集します)。どちらでも機能するはずですが、簡単なので最初のものをお勧めします。 _cp_cp_cp&_cp_cpvoid addCar(char *car, void *arg)void addCar(char *car, void **arg)addCar()

于 2009-09-04T02:19:58.343 に答える
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;
}
于 2009-09-04T03:27:34.170 に答える