当我使用POSIX sem_init()
函数编译程序时,我得到一个编译警告(因为我通常使用的错误-Werror
),当我在Mac OS X 10.10.1(Yosemite)上使用GCC 4.9.1或版本的版本编译时,该函数已被弃用Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
来自XCode 6.1.1的Clang().快速浏览一下/usr/include/sys/semaphore.h
表示此功能确实有__deprecated
它的声明之后的标签,因为这样做
sem_getvalue()
和
sem_destroy()
.
问题:
鉴于POSIX规范中没有任何弃用的暗示,为什么在Mac OS X上将这三个函数单独列为已弃用?
鉴于它们已被弃用,替代品是什么,为什么替代品更受欢迎?
(我确实首先检查了Ask Different ;没有标记c的问题,也没有问题询问已弃用的系统调用 - 只有程序.)
我正在尝试移植一个使用Semaphores到Mac OS X的项目(从linux)但是在Mac OS X上没有实现一些posix信号量
我在这个港口遇到的那个是 sem_timedwait()
我对信号量知之甚少,但是从手册页sem_wait()
似乎接近sem_timedwait
并且实现了
从手册页
sem_timedwait()
function应锁定函数中
sem
as所引用的信号量sem_wait()
.但是,如果在
不等待另一个进程或线程
通过执行sem_post()
函数来解锁信号量的情况下无法锁定信号量,则
在指定的超时到期时应终止此等待
从我对semphores如何工作的有限理解,我可以看到sem_timedwait()
更安全,但我仍然应该能够使用sem_wait()
它是否正确?如果不是我还有其他选择......
谢谢
我写了一个简单的程序,使用信号量解决了Readers-Writers问题.它在Linux操作系统上完美运行,但是当我在我的Mac OSX上运行时,我得到了意想不到的结果,我无法弄清楚原因.
我的计划:
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* function1(void* val);
void* function2(void* val);
// shared values
volatile int X;
volatile int Y;
// declare semaphores
sem_t s1;
sem_t s2;
main()
{
void* status;
pthread_t thread1;
pthread_t thread2;
srand(time(NULL));
// initialize semaphores to zero
sem_init(&s1, 0, 0);
sem_init(&s2, 0, 0);
pthread_create(&thread1, NULL, function1, NULL);
pthread_create(&thread2, NULL, function2, NULL);
pthread_join(thread1, &status);
pthread_join(thread2, &status);
sem_destroy(&s1);
sem_destroy(&s2);
}
void* function1(void* val)
{
while(1)
{
X = rand()%1000; // …
Run Code Online (Sandbox Code Playgroud) 我正在用POSIX API编写一个C程序并使用Linux.我在朋友的Mac OSX PC上编译并运行它并且出现了一个小错误,但我没有使用Linux特有的功能.
我将使用Linux添加到API的一些特定功能.我还将为Mac Os X和FreeBSD使用特定的POSIX扩展.
我将使用条件编译来选择代码.如果OS不是那些,我将使用通用POSIX代码.
我不拥有Darwin/Mac OSX和FreeBSD,Linux是我在PC上唯一拥有的操作系统.我无法下载和安装FreeBSD,因为它超过500 MB.
我想知道一种方法来测试程序是否会在其他POSIX系统上按预期编译和运行.
我想知道是否有POSIX模拟器和编译器来进行测试.
测试很简单,它们不使用GUI和驱动程序,它们只是命令行.
我需要做3个测试:FreeBSD,Mac OSX/Darwin和Generic POSIX,但我没有这些工具.
编辑
有没有GUI的FreeBSD和Darwin的最小版本,但有GCC/G ++和ssh/scp?达尔文是免费的,不是吗?
我的电脑很旧,但我想我可以将它们安装在虚拟机中,创建虚拟网络并使用ssh/scp来传输和测试程序.
我正在尝试通过信号量为Mac OS X中的一堆线程实现共享内存的同步使用.
(我只是忽略了Mac用户在初始化信号量并销毁它时遇到很多问题......可以通过sem_open()和sem_unlink()来修复:D
但显然,为了获得信号量的当前值,除了sem_getvalue()之外什么也没有在mac os x中实现.
对没有运行linux操作系统的人有任何建议,应该在几个小时内上传他的作业??!:)
谢谢
可能重复:
Objective-c:如何舍入Float值?
我知道它与NSNumberformatter类,请问任何示例代码?
#include <semaphore.h>
sem_t* x;
int main ()
{
x = sem_open("x", O_CREAT, 0, 0);;
sem_wait(x); sem_wait(x); sem_wait(x);
std::cout << "\ndone\n";
}
Run Code Online (Sandbox Code Playgroud)
这段代码甚至不应该通过第一个sem_wait()
,但在我的系统上它到达了main()
. 我读过的所有内容,例如这里和这里,都说,虽然Mac OS X不支持sem_init()
,但它确实支持sem_open()
。然而,sem_open()
按照上面的使用方法并没有解决问题。我运行的是 OS X 10.5.7。