macos - Mac OS X 中的 Pthreads - 互斥锁问题

标签 macos pthreads mutex

我正在尝试学习如何使用 POSIX 线程在 C 语言中编写并行算法。我的环境是带有 gcc 4 的 Mac OS X 10.5.5。

编译:

gcc -Wall -D_REENTRANT -lpthread source.c -o test.o

所以,我的问题是,如果我在 Ubuntu 9.04 机器上编译它,它会按线程顺序顺利运行,在 Mac 上看起来互斥锁不起作用,线程不会等待获取共享信息。

麦克:

#1
#0
#2
#5
#3
#4

Ubuntu

#0
#1
#2
#3
#4
#5

有什么想法吗?

按照下面的源代码:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define NUM_THREADS 6
pthread_mutex_t mutexsum;
pthread_t threads[NUM_THREADS];
long Sum;

void *SumThreads(void *threadid){
    int tmp;
    int i,x[10],y[10];

    // Para cada x e y do vetor, jogamos o valor de i, só para meio didáticos
    for (i=0; i<10 ; i++){
        x[i] = i;
        y[i] = i;
    }


    tmp = Sum;
     for (i=0; i<10 ; i++){
         tmp += (x[i] * y[i]);
     }

       pthread_mutex_lock (&mutexsum);
       Sum += tmp;
       printf("Im thread #%ld sum until now is: %ld\n",threadid,Sum);
       pthread_mutex_unlock (&mutexsum);
       return 0;
}


int main(int argc, char *argv[]){
    int i;
    Sum = 0;

    pthread_mutex_init(&mutexsum, NULL);

    for(i=0; i<NUM_THREADS; i++){
        pthread_create(&threads[i], NULL, SumThreads, (void *)i);
    }

    pthread_exit(NULL);
}

最佳答案

您的代码中没有任何内容可以让您的线程以任何 顺序运行。如果在 Ubuntu 中按某种顺序运行,那可能是因为你很幸运。尝试在 Ubuntu 中运行 1000 次,看看你是否一遍又一遍地得到相同的结果。

问题是,您无法控制调度程序使您的线程访问处理器的方式。因此,当您遍历 for 循环创建线程时,您不能假设对 pthread_create 的第一次调用会首先运行,或者会锁定您首先创建的互斥量。这取决于操作系统级别的调度程序,您无法控制它,除非您编写自己的内核:-)。

如果您想要串行行为,为什么首先要在单独的线程中运行您的代码?如果它只是为了实验,那么我可以想到的一种解决方案是使用 pthread_signal 唤醒特定线程并使其运行......然后被唤醒的线程可以唤醒第二个线程,依此类推。

希望对您有所帮助。

关于macos - Mac OS X 中的 Pthreads - 互斥锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410633/

相关文章:

algorithm - 关于任务并行化的问题

java - 如何确保只有一个 Java 应用程序实例在运行?

c++ - 如何在 Ruby 和另一种语言之间共享文本文件(或互斥量/信号量)?

javascript - 测试一个 javascript 互斥锁实现

mysql - 在 Mac OS X 10.12 上使用 pip 安装 MySQLdb 报错

c - 在单核机器上运行 3 个并行线程

macos - 无法在 Mac 上注册 Apple 推送通知服务

c - 如何访问结构中包含的数组的地址?

objective-c - 如何在另一台Mac上运行未签名的cocoa应用程序构建?

xcode - 使用 Apple 的私有(private)框架 UXKit 进行 MacOS 应用程序开发是否安全?