Потокобезопасный код с мьютексом
Пытаюсь сделать мою реализацию связанного списка в 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()
, вы должны гарантировать, что все общие данные должны быть атомарными.
Поэтому я думаю, что вы должны использовать первый, то есть использовать один вызов пары блокировка / разблокировка для реализации всей функции.