Каково точное определение атомарности в программировании? - PullRequest
0 голосов
/ 12 мая 2019

определение «атомарности» говорит о том, что транзакция должна иметь возможность быть прерванной без какого-либо прикосновения или манипулирования, возможно, одновременным выполнением действий во время ее процесса.Но значит ли это, что программа не должна запускаться одновременно, когда она должна быть атомарной?

скажем, у нас есть 2 программы в качестве примера:

example_program1:

подсчитывает int i = от 1 до 100 каждую секунду

каждое число печатается в новой строке

example_program2:

просто печатает "привет"

и родительская программа, которая включает обе эти программы и запускает их один раз, получая сигнал для запуска конкретной программы (например, через sigaction в linux) с 2 версией:

версия 1:

запускает программу (даже одновременную) в любое время после получения сигнала

, что означает, что программа2 может печатать "привет", в то время как программа1 все еще печатает числа

версия 2:

запускать только одну программу за раз

сигнал для другой программы блокируется до тех пор, пока не завершится выполнение программы

inэтот пример, может только версия 2 считается атомной или бдру?Будет ли эта программа неатомарной, только если, например, программа2 будет увеличивать i на 1 во время своего процесса?

1 Ответ

0 голосов
/ 12 мая 2019

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

Я хотел бы объяснить это с помощью программы многопоточного производства и потребителя с условиями rase.

#include <stdio.h>
#include <pthread.h>


pthread_cond_t condicion = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int cont = 0;

void* productor(){
while(1){   
  pthread_mutex_lock(&mutex);
  while(cont != 0)
  {
    pthread_cond_wait(&condicion, &mutex);
  }
  cont++;
  printf("%d\n",cont);
  pthread_cond_signal(&condicion);
  pthread_mutex_unlock(&mutex);
}
}

void* consumidor(){
while(1)
{
  pthread_mutex_lock(&mutex);
  while(cont == 0)
  {
    pthread_cond_wait(&condicion, &mutex);
  }
  cont--;
  printf("%d\n",cont);
  pthread_cond_signal(&condicion);
  pthread_mutex_unlock(&mutex);
  }
  }

 int main(){


pthread_t id_hilo1,id_hilo2;

pthread_create(&id_hilo1, NULL, &productor, NULL);
pthread_create(&id_hilo2, NULL, &consumidor, NULL);

pthread_join(id_hilo1, NULL);
pthread_join(id_hilo2, NULL);

return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...