【问题标题】:pthread and semaphore not working for me in osx maverick 10.9pthread 和 semaphore 在 osx maverick 10.9 中对我不起作用
【发布时间】:2014-05-01 14:43:09
【问题描述】:

我有以下涉及 pthread 和信号量的简单程序。我在 osx Maverck 10.9 中。我使用 makefile 来编译程序(而不是 xcode)。我用的是 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是

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。但在多次运行时不一致。

例如:

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

【问题讨论】:

  • 问题肯定不是“您能帮我调试一下代码吗?”,是吗?

标签: c++ pthreads posix osx-mavericks semaphore


【解决方案1】:

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

使用sem_open 而不是sem_init。不要使用sem_destroy,而是使用 sem_close 和 sem_unlink

你会很高兴的。

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 2016-10-15
    • 2013-03-16
    • 2014-05-28
    • 2018-03-19
    • 2013-11-07
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多