“原子性”的定义表示,事务应该能够被终止,而不会在其过程中被并发的运行动作所触及或操纵。但这是否还意味着程序在应为原子状态时不应并发运行?
让我们以2个程序为例:
example_program1:
每秒计算int i = 1到100
每个数字都用新行打印
example_program2:
只打印“ hi”
和一个包含这两个程序的父程序,并在收到信号以使用2版本启动特定程序(例如,通过sigaction)启动后运行它们:
版本1:
在收到信号后随时运行程序(甚至并发)
这意味着在program1仍打印出数字时,program2可以打印“ hi”
版本2:
一次只能运行一个程序
其他程序的信号被阻止,直到正在进行的程序终止
在此示例中,只能将版本2视为原子的还是两者都视为?仅当例如program2在其处理过程中将i加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;
}