簡體   English   中英

C-Pthreads互斥鎖和普遍頭痛

[英]C - Pthreads mutex and general headaches

大家好,我想知道是否有人可以提供一些幫助。

我一直在嘗試自學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);
        }
    }

}

----因為它不再適用而無法正常工作而被剪斷----

-刪除了一些,因為它不再適用並且仍然無法正常工作-

這是您的錯誤:

            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() )。 任一個都可以,但是我建議第一個,因為它更容易。

您在具有鎖定功能的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM