Является ли Java Lock a PThread_Mutex в C? - PullRequest
0 голосов
/ 05 мая 2020

Я написал ту же самую программу в C и Java, где два потока увеличивают глобальный счетчик. Для обеспечения эксклюзивности доступа по счетчику в C используется pthread_mutex_t, а в Java synchronized(lock):

Версия C:

  1 #include <stdio.h>
  2 #include <pthread.h>
  3 
  4 static volatile int global;
  5 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
  6 
  7 static void *run(void *arg) {
  8     int nLoop = *((int *) arg);
  9     int localValue;
 10 
 11 
 12 
 13 
 14 
 15     for (int j = 0; j < nLoop; j++) {
 16         pthread_mutex_lock(&mtx);
 17         localValue = global;
 18         localValue = localValue + 1;
 19         global     = localValue;
 20         pthread_mutex_unlock(&mtx);
 21     }
 22     return NULL;
 23 }
 24 
 25 int main() {
 26     pthread_t t1, t2;
 27     int nLoop = 100000;
 28 
 29     int i = 0;
 30     while (i<10) {
 31         global = 0;
 32         pthread_create(&t1, NULL, run, &nLoop);
 33         pthread_create(&t2, NULL, run, &nLoop);
 34 
 35         pthread_join(t1, NULL); pthread_join(t2, NULL);
 36         printf("global: %d\n", global);
 37         i++;
 38     }
 39     return 0;
 40 }

Версия Java:

  1 public class ThreadIncr {
  2 
  3 
  4     static int global;
  5     private final static Object lock = new Object();
  6 
  7     static class R implements Runnable {
  8         int nLoop;
  9         int localValue;
 10 
 11         public R(int nLoop) { this.nLoop = nLoop; }
 12 
 13         @Override
 14         public void run() {
 15             for(int j = 0; j<this.nLoop; j++) {
 16                 synchronized(lock) {
 17                     localValue = global;
 18                     localValue = localValue + 1;
 19                     global = localValue;
 20                 }
 21             }
 22         }
 23     }
 24 
 25     public static void main(String[] args) throws InterruptedException {
 26         Thread t1, t2;
 27         int nLoop = 100000;
 28 
 29         int i = 0;
 30         while (i < 10) {
 31             global = 0;
 32             t1 = new Thread(new R(nLoop));
 33             t2 = new Thread(new R(nLoop));
 34             t1.start(); t2.start();
 35             t1.join();  t2.join();
 36             System.out.println("global: " + global);
 37             i++;
 38         }
 39     }
 40 }

Таким образом, блокировка Java - это мьютекс в C?

1 Ответ

0 голосов
/ 05 мая 2020

В Java "синхронизированный (блокировка)" означает, что используется так называемая блокировка монитора . Эта блокировка монитора обеспечивает взаимное исключение ( ссылка ). Таким образом, он обеспечивает ту же функциональность, что и мьютекс в C.

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