受这个问题的启发,我写了测试:
public class Main {
private static final long TEST_NUMBERS = 5L;
private static final long ITERATION_NUMBER = 100000L;
private static long value;
public static void main(final String [] args) throws Throwable {
for(int i=0; i<TEST_NUMBERS; i++) {
value = 0;
final Thread incrementor = new Thread(new Incrementor());
final Thread checker = new Thread(new Checker());
incrementer.start();
checker.start();
checker.join();
incrementer.join();
}
}
static class Incrementor implements Runnable {
public void run() {
for(int i=0; i<ITERATION_NUMBER; i++){
++value;
}
} …Run Code Online (Sandbox Code Playgroud) 现在写class得很复杂,觉得我用得太多了CRITICAL_SECTION.
据我所知,某些类型的原子操作总是在没有任何硬件或软件中断的情况下执行.
我想检查一下我是否理解正确.
CRITICAL_SECTION因为这样做不会有中断.bool 是原子的.所以有我的陈述,想问一下,如果它们是正确的,如果它们是正确的,那么什么类型的变量也可以设置或没有CRITICAL_SECTION?
PS我在谈论为每种方法获取或设置一个单值,而不是两个,而不是五个,而是一个.
我正在学习C.我正在编写一个包含多个线程的应用程序; 我知道当一个变量在两个或多个线程之间共享时,最好使用互斥锁来锁定/解锁,以避免死锁和变量的不一致.当我想要更改或查看一个变量时,这一点非常清楚.
int i = 0; /** Global */
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
/** Thread 1. */
pthread_mutex_lock(&mutex);
i++;
pthread_mutex_unlock(&mutex);
/** Thread 2. */
pthread_mutex_lock(&mutex);
i++;
pthread_mutex_unlock(&mutex);
Run Code Online (Sandbox Code Playgroud)
我认为这是正确的.i在执行结束时,变量包含整数2.
无论如何,在某些情况下,我不知道确切地将两个函数调用放在哪里.
例如,假设您有一个函数obtain(),它返回一个全局变量.我需要从两个线程中调用该函数.我还有另外两个调用函数的线程,set()用一些参数定义; 此函数将设置相同的全局变量.在获取/设置var之前需要执行某些操作时,这两个函数是必需的.
/** (0) */
/** Thread 1, or 2, or 3... */
if(obtain() == something) {
if(obtain() == somethingElse) {
// Do this, sometimes obtain() and sometimes set(random number) (1)
} else {
// Do that, just obtain(). (2)
}
} …Run Code Online (Sandbox Code Playgroud)