编程中“原子性”的确切定义是什么?

时间:2019-05-11 22:39:09

标签: linux concurrency

“原子性”的定义表示,事务应该能够被终止,而不会在其过程中被并发的运行动作所触及或操纵。但这是否还意味着程序在应为原子状态时不应并发运行?

让我们以2个程序为例:

example_program1:

  

每秒计算int i = 1到100

     

每个数字都用新行打印

example_program2:

  

只打印“ hi”

和一个包含这两个程序的父程序,并在收到信号以使用2版本启动特定程序(例如,通过sigaction)启动后运行它们:

版本1:

  

在收到信号后随时运行程序(甚至并发)

     

这意味着在program1仍打印出数字时,program2可以打印“ hi”

版本2:

  

一次只能运行一个程序

     

其他程序的信号被阻止,直到正在进行的程序终止

在此示例中,只能将版本2视为原子的还是两者都视为?仅当例如program2在其处理过程中将i加1时,该程序才是非原子的吗?

1 个答案:

答案 0 :(得分:0)

Hi Atomic操作提供的指令可以原子执行而不会中断。就像原子最初被认为是不可分割的粒子一样,原子操作也是不可分割的指令。

我想用带有多线程条件的程序多线程生产和使用者来解释这一点。

#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;
}