Mac OS X中的Pthreads - Mutexes问题

raf*_*lxy 2 macos mutex pthreads

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

编译:

gcc -Wall -D_REENTRANT -lpthread source.c -o test.o
Run Code Online (Sandbox Code Playgroud)

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

苹果电脑:

#1
#0
#2
#5
#3
#4
Run Code Online (Sandbox Code Playgroud)

Ubuntu的

#0
#1
#2
#3
#4
#5
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

按照以下源代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

Pab*_*ruz 10

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

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

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

希望能帮助到你.