Как реализовать собственный мьютекс с помощью метода множественной блокировки-разблокировки?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как реализовать собственный мьютекс с помощью метода множественной блокировки-разблокировки?

Сообщение Anonymous »

Я хотел бы реализовать собственный мьютекс, отличный от std::mutex.
Я хочу, чтобы он имел следующие методы:
  • lock( ) : блокирует мьютекс так же, как std::mutex, может иметь системные вызовы, заставлять вызывающую сторону отказываться от своего процессора и вызывать переключение контекста.
  • spinlock(): блокирует мьютекс без системных вызовов , вызывающий абонент не отказывается от своего процессора и не вызывает контекст переключение.
  • try_lock(): пытается заблокировать и возвращает результат.
  • unlock(): разблокирует этот мьютекс независимо от того, заблокирован ли он блокировкой. () или spinlock()
Если эти методы можно будет реализовать, я смогу написать коды, которые, по моему мнению, будут иметь более высокую производительность.

Код: Выделить всё

custom_mutex cm; //declaration

void producer(){
cm.spinlock();  //the producer section has extremely less contention, so I use spinlock().
//producer works...
}

void consumer(){
cm.lock();      //the consumer section consumes quickly and waits a lot, so lock() is better.
//consumer works...

}

Кроме того, у меня есть вопросы по поводу std::mutex::try_lock, когда я использую " while(!std::mutex::try_lock())", это похоже на спин-блокировку, в чем разница между тестированием std::mutex::try_lock в цикле и использованием специальной реализованной спин-блокировки?
На самом деле я пытаюсь реализовать регистратор. Это модель с несколькими производителями и одним потребителем, использующая очередь MPSC. Скажем, в программе есть потоки с кодами, регистрирующими сообщения, которые создают запросы на печать в поток регистратора, а поток регистратора должен печатать сообщения, содержащиеся в очереди, и извлекать их почти немедленно. Я хочу, чтобы производители тратили как можно меньше времени, поэтому я хочу, чтобы очередь для производителей не блокировалась (с использованием атомного целого), не попадала в переключение контекста и системные вызовы. Кроме того, поток регистратора не должен быть занят ожиданием, поэтому необходима условная переменная или семафор.
Но std::mutex, условная переменная, используемая для синхронизации, является дорогостоящей для производителей, когда производители используют это для установки флагов для пробуждения потребителя. Поскольку производители не хотят, чтобы процессор заменялся просто для фиксации запроса на регистрацию, я действительно хочу, чтобы он был без блокировок. (используя спин-блокировку для защиты переменных, связанных с переменной условия)
И для потока логгера Я хочу использовать std::mutex с условной переменной, чтобы избежать ожидания занятости.
Итак, сценарий такой:

Код: Выделить всё

class Logger{
Lock_Free_Queue q;
condition_variable cv;
custom_mutex lok;   // mutex that I'd like to implement
int count=0;

void commit_msg(string msg){
q.push(msg);  //thread safe guaranteed by lock free method (using atomic int, etc..)
lok.spinlock();  //avoid context switching and system calls, will be unblocked very soon
count++;         //assuming that q.empty() can't use as a flag of consumable product, so 'int count' is used.
lok.unlock();
cv.notify_all(); // wake up logger thread
}

void logger_thread(){
lok.lock();  // logger thread isn't sensitive to context switching and waits for most of the time.
while(count

Подробнее здесь: [url]https://stackoverflow.com/questions/79313900/how-to-implement-a-custom-mutex-with-multiple-lock-unlock-method[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»