Потокобезопасный код с мьютексом

Пытаюсь сделать мою реализацию связанного списка в c11 (gcc6), threadsafe. единственное, что я не получаю, сколько мьютекс-блокировок и разблокировок я должен использовать?

/**
 * adds a new node to head of the list, alocation of node is done dynamically
 * @param list  address of list
 * @param data pointer to data
 */
void add_head(Linked_list* list, void* data)
{
    Node *node = (Node*) malloc(sizeof(Node));
    //lock
    node->data = data;
    if (list->head == NULL) {
        list->tail = node;
        node->next = NULL;
    } else {
        node->next = list->head;
    }
    list->head = node;
    list->current = node;
    list_size ++;
    //unlock
}

или же

/**
 * adds a new node to head of the list, alocation of node is done dynamically
 * @param list  address of list
 * @param data pointer to data
 */
void add_head(Linked_list* list, void* data)
{
    Node *node = (Node*) malloc(sizeof(Node));
    //lock
    node->data = data;
    if ( list->head == NULL ) {
        list->tail = node;
        node->next = NULL;
    } else {
        node->next = list->head;
    }
    //unlock

    //lock
    list->head = node;
    list->current = node;
    list_size ++;
    //unlock
}

или же

/**
 * adds a new node to head of the list, alocation of node is done dynamically
 * @param list  address of list
 * @param data pointer to data
 */
void add_head (Linked_list* list, void* data)
{
    Node *node = (Node*) malloc(sizeof(Node));
    //lock
    node->data = data;
    if (list->head == NULL) {
        list->tail = node;
        node->next = NULL;
    } else {
        node->next = list->head;
    }
   //unlock

   //lock
   list->head = node;
   //unlock

   //lock
   list->current = node;
   //unlock

   //lock
   list_size ++;
   //unlock
}

ищу способ не заставлять другой поток ждать слишком много, так как у меня будет много задач крошечной длительности чтения файла до 10 байт, изменения в памяти 10 байт, записи файла 10 байт.

1 ответ

Потому что вы хотите поддержать threadsafe для вашей реализации функции add_head(), вы должны гарантировать, что все общие данные должны быть атомарными.

Поэтому я думаю, что вы должны использовать первый, то есть использовать один вызов пары блокировка / разблокировка для реализации всей функции.

Другие вопросы по тегам