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