- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 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中的互斥锁?
最佳答案
在Java中“synchronized(lock)”意味着使用所谓的监视器锁。该监视器锁提供互斥( link )。因此,它提供了与 C 中互斥锁相同的功能。
关于java - Java 锁是 C 中的 PThread_Mutex 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61611598/
我不明白为什么在这段代码中我遇到了死锁。我已经定义了这个互斥体: 互斥锁3:= 0(锁定) 互斥锁2:= 1(解锁) 我有 2 个进程:父亲和儿子。每个线程都有 N 个线程,我通过参数传递这些线程。子
我有以下代码: bool Mutex::timed_lock(unsigned long milliseconds) { if (!milliseconds) { re
问题背景 有问题的代码与 C++ 实现有关。我们有代码库,其中对于某些关键实现,我们使用 asm volatile ("mfence":"memory")。 我对内存障碍的理解是—— 用于确保指令集的
在使用 pthread_mutex_t 之前,应该调用 pthread_mutex_init(),在不再需要它之后,应该使用 pthread_mutex_destroy() 销毁它。 我的问题是,如果
使用 pthreads 在获得锁之前必须在任何互斥体上调用 pthread_mutex_init()。 根据 POSIX,锁定未初始化的互斥量仅针对具有优先级保护的互斥量 (opengroup : p
我目前正在阅读操作系统:三篇简单的文章,我开始了解并发背后的逻辑。在第 26 个“章节”中,我们得到了这个线程示例和围绕原子性的问题: #include #include #include st
我已经搜索了很多小时来寻找解决方案,但找不到简单的答案。我有一个类,它使用 pthreads。实际的函数指针在类中是静态的,我需要锁定互斥体,因为到目前为止我得到了“奇怪”的结果(参数未正确传递)。
我目前正在尝试使用 pthread_mutex 模型在 Linux 中同步两个进程。 这是我正在处理的代码: #include #include #include #include using
我正在尝试在 Linux 中使用基于健壮的 futex 的 pthread 互斥体,因为我需要既快速又健壮(恢复“死”锁)。我如何检查任何 Linux 系统上的 pthread 互斥库是否基于健壮的
我尝试在 pthread_mutex 上创建一个包装器,该包装器维护当前线程持有的所有互斥锁的列表。但是,我也使用了某些库代码,对此我不可能使用这个包装器。有什么办法可以得到这个通用 pthread_
我用 C 和 Java 编写了完全相同的程序,其中两个线程递增全局计数器。为了确保 C 中计数器访问的排他性,使用了 pthread_mutex_t,而在 Java 中则使用 synchronized
在 pthread_mutex_init 等接口(interface)的手册页中, int pthread_mutex_init(pthread_mutex_t *restrict mutex,
根据手册页 pthread_mutex_lock locks the given mutex. If the mutex is currently unlocked, it becomes locke
boost::details::pool::pthread_mutex 和 boost::details::pool::null_mutex 有什么区别。 我看到在最新的 boost 版本 - 1.4
我现在正在学习多线程编程,我注意到使用互斥锁实现同步的程序在 Mac OS X 上非常慢,在某种程度上通常最好使用单线程。我知道有更快的同步方式,但我仍然想知道为什么会这样。为了简单的时间测量,我写了
我是一名优秀的程序员,十分优秀!