如何在 C 中 p_threads 之间共享互斥量?
How to Share Mutex Between p_threads in C?
我对这个问题很困惑,我有 10 个线程试图插入队列。
我想使用 queue.h.
中全局定义的互斥锁来防止同时插入多个
我有 2 个队列 waiting
和 working
我只是给了它一秒钟,尽管给同一个 DS 同一个互斥锁是没有效率的,因为这会阻止并行处理它们,即使没有有问题(如果我错了请纠正我)。
这意味着我需要为队列的每个副本互斥,我尝试在其中定义它:
struct queue
{
pthread_mutex_t m; //new
pthread_cond_t c; //new
int queue_size;
struct queue_node *head, *tail;
};
但在这种情况下,它不是全局的,因此线程不能与同一个互斥锁相关,我怎样才能轻松解决这个问题?
如果你需要这个:
waiting_buffer = create_queue();
working_buffer = create_queue();
struct queue *create_queue() {
pthread_mutex_init(&m, NULL); /** initialize mutex **/
pthread_cond_init(&c, NULL);/** initialize cond **/
struct queue *q = (struct queue *) malloc(sizeof(struct queue));
q->head = q->tail = NULL;
q->queue_size = 0;
return q;
}
听起来您想要每个队列的互斥锁和条件变量,因此您希望将它们包含在 create_queue
返回的结构中。你这样做了;你只是没有在 create_queue
.
中引用它们
// Sets `errno` and returns `NULL` on error.
struct queue *create_queue(void) {
struct queue *q = (struct queue *)malloc(sizeof(struct queue));
if (!q)
return NULL;
pthread_mutex_init(&(q->m), NULL);
pthread_cond_init(&(q->c), NULL);
q->head = q->tail = NULL;
q->queue_size = 0;
return q;
}
我对这个问题很困惑,我有 10 个线程试图插入队列。 我想使用 queue.h.
中全局定义的互斥锁来防止同时插入多个我有 2 个队列 waiting
和 working
我只是给了它一秒钟,尽管给同一个 DS 同一个互斥锁是没有效率的,因为这会阻止并行处理它们,即使没有有问题(如果我错了请纠正我)。
这意味着我需要为队列的每个副本互斥,我尝试在其中定义它:
struct queue
{
pthread_mutex_t m; //new
pthread_cond_t c; //new
int queue_size;
struct queue_node *head, *tail;
};
但在这种情况下,它不是全局的,因此线程不能与同一个互斥锁相关,我怎样才能轻松解决这个问题?
如果你需要这个:
waiting_buffer = create_queue();
working_buffer = create_queue();
struct queue *create_queue() {
pthread_mutex_init(&m, NULL); /** initialize mutex **/
pthread_cond_init(&c, NULL);/** initialize cond **/
struct queue *q = (struct queue *) malloc(sizeof(struct queue));
q->head = q->tail = NULL;
q->queue_size = 0;
return q;
}
听起来您想要每个队列的互斥锁和条件变量,因此您希望将它们包含在 create_queue
返回的结构中。你这样做了;你只是没有在 create_queue
.
// Sets `errno` and returns `NULL` on error.
struct queue *create_queue(void) {
struct queue *q = (struct queue *)malloc(sizeof(struct queue));
if (!q)
return NULL;
pthread_mutex_init(&(q->m), NULL);
pthread_cond_init(&(q->c), NULL);
q->head = q->tail = NULL;
q->queue_size = 0;
return q;
}