pthread和信号量在osx maverick 10.9中对我不起作用 [英] pthread and semaphore not working for me in osx maverick 10.9

查看:86
本文介绍了pthread和信号量在osx maverick 10.9中对我不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下涉及pthread和semaphore的简单程序.我在osx Maverck 10.9中.我使用makefile来编译程序(而不是xcode).我使用的是c ++ 11.

I have the following simple program involving pthread and semaphore. I am in osx Maverck 10.9. I use a makefile to compile the program (rather than xcode). I use c++11.

#include <pthread.h>
#include <semaphore.h>
#include <cassert>
#include <iostream>

#define ASSERT(a) if(!(a)) abort

using namespace std;

sem_t countMutex;
int myCount=0;

void *doThread(void *data) {
    int *pi = reinterpret_cast<int *>(data);
    sem_wait(&countMutex);
    for(int i =0 ;i < 100; ++i) {
        myCount += 1;
    }
    sem_post(&countMutex);
    pthread_exit( NULL );
}

void LaunchThread() {
    const int kNumThreads = 10;
    pthread_t tids[kNumThreads];
    int threadData[kNumThreads];
    pthread_attr_t attr;
    pthread_t tid;
    int retVal=0;
    retVal = pthread_attr_init(&attr);
    ASSERT(retVal == 0);
    retVal = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE );
    ASSERT(retVal == 0);
    sem_init(&countMutex, 0, 1);
    myCount = 0;
    for(int i=0; i < kNumThreads; ++i) {
        threadData[i] = i;
        retVal = pthread_create( &tids[i], &attr, &doThread, &threadData[i]);
        if(retVal != 0) {
            cerr << "cannot create thread" << endl;
            return;
        }
    }

    retVal = pthread_attr_destroy(&attr);
    ASSERT(retVal == 0);
    void *status = NULL;
    for(int i=0; i < kNumThreads; ++i) {
        retVal = pthread_join( tids[i], &status);
        if(retVal != 0) {
            cerr << "cannot join ghread " << i << ", " << tids[i] << endl;
            return;
        }
        cout << "completed thread " << i << ", " << tids[i] << endl;
    }
    cout << "value of myCount: " <<  myCount << endl;
    sem_destroy(&countMutex);
    //sem_unlink(&countMutex);
    pthread_exit( NULL );
}
int main( int argc, char **argv) {
    LaunchThread();
    return 0;
}

用于编译该文件的makefile是

The makefile for compiling this is

CXX=clang++
CXXFLAGS=-g -Wall -Wno-deprecated -std=c++11 -pthread  -D DEBUG -g3 $(INCLUDES)
LDFLAGS=$(LIBS)

OBJS=main.o
PROG=test

all: $(PROG)


$(PROG): $(OBJS)
$(CXX) -v -o $(PROG) main.o $(LDFLAGS)

%.o: %.cpp
$(CXX) -c $(CXXFLAGS) $<

clean:
rm $(OBJS); rm test

该程序应该报告myCount的值为1000.但是在多次运行中不一致.

The program ought to have reported a value of 1000 for myCount. But is inconsistent, on multiple runs.

例如:

completed thread 0, 0x107dca000
completed thread 1, 0x107e4d000
completed thread 2, 0x107ed0000
completed thread 3, 0x107f53000
completed thread 4, 0x107fd6000
completed thread 5, 0x108059000
completed thread 6, 0x1080dc000
completed thread 7, 0x10815f000
completed thread 8, 0x1081e2000
completed thread 9, 0x108265000
value of myCount: 900

推荐答案

OSX不支持未命名的POSIX信号灯.如果检查返回码,您将看到sem_init失败,并在这些行上出现错误.您需要使用命名信号量.

Unnamed POSIX semaphores are not supported on OSX. If you check your return codes you will see sem_init fail with an error along those lines. You need to use named semaphores.

使用sem_open代替sem_init.不要使用sem_destroy,而是使用sem_close和sem_unlink.

Use sem_open instead of sem_init. Don't use sem_destroy but rather sem_close and sem_unlink.

您会很高兴.

这篇关于pthread和信号量在osx maverick 10.9中对我不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆