[英]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.