假设我想将原子指令设置为函数。
我宣布
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
作为全局变量。
而不是:
int main() {
myFoo();
...
}
void myFoo() {
pthread_mutex_lock(&mutex);
myGlobal++;
pthread_mutex_unlock(&mutex);
}
我可以做:
int main() {
pthread_mutex_lock(&mutex);
myFoo();
pthread_mutex_unlock(&mutex);
...
}
void myFoo() {
myGlobal++;
}
以便myFoo
中的每个指令都变成原子的?
您需要正确使用术语,否则其含义将是错误的。
否,不会是atomic,但是对myFoo
的访问将被同步,这意味着当另一个线程正在使用它时,没有其他线程可以访问该零件代码。
Atomic操作术语,表示一条指令在没有任何中断的情况下运行(有时被认为是无锁的)。例如,C11的atomic_flag
提供了这样的功能。另一方面,互斥锁用于创建atomic_flag
。您可以保护代码的一部分,以防止来自不同线程的同时访问。这两个术语不相似。
旁注:
只有mutual exclusion类型保证是真正的原子性且无锁,atomic_
既是C又是C ++。其他诸如atomic_flag
的对象可以使用同步方法来实现,并且不是无锁的。