pthread 和 semaphore 在 osx maverick 10.9 中不适用于我

2023-12-14

我有以下涉及 pthread 和信号量的简单程序。我使用的是 os x Maverick 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

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

Eg:

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失败并出现错误。您需要使用命名信号量。

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

你会很高兴去的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pthread 和 semaphore 在 osx maverick 10.9 中不适用于我 的相关文章

  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐