总是返回-1说明初始化错误,原因是由于iOS不支持创建无名的信号量所至。
解决方案是造建有名的信号量。
代码如下:
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <assert.h>
#include <semaphore.h>
sem_t * CreateSemaphore( const char * inName, const int inStartingCount );
bool DestroySemaphore( sem_t * inSemaphore );
void SignalSemaphore( sem_t * inSemaphore );
void WaitSemaphore( sem_t * inSemaphore );
bool TryWaitSemaphore( sem_t * inSemaphore );
bool ClearSemaphore( const char * inName);
//
sem_t * CreateSemaphore( const char * inName, const int inStartingCount )
{
sem_t * semaphore = sem_open( inName, O_CREAT, 0644, inStartingCount );
//
if( semaphore == SEM_FAILED )
{
switch( errno )
{
case EEXIST:
printf( "Semaphore with name '%s' already exists.\n", inName );
break;
default:
printf( "Unhandled error: %d.\n", errno );
break;
}
//
assert(false);
return SEM_FAILED;
}
//
return semaphore;
}
//
bool DestroySemaphore( sem_t * inSemaphore )
{
int retErr = sem_close( inSemaphore );
//
if( retErr == -1 )
{
//
switch( errno )
{
case EINVAL:
printf( "inSemaphore is not a valid sem_t object." );
break;
default:
printf( "Unhandled error: %d.\n", errno );
break;
}
//
assert(false);
return false;
}
//
return true;
}
//
void SignalSemaphore( sem_t * inSemaphore )
{
sem_post( inSemaphore );
}
//
void WaitSemaphore( sem_t * inSemaphore )
{
sem_wait( inSemaphore );
}
//
bool TryWaitSemaphore( sem_t * inSemaphore )
{
int retErr = sem_trywait( inSemaphore );
//
if( retErr == -1 )
{
//
if( errno != EAGAIN )
{
printf( "Unhandled error: %d\n", errno );
assert( false );
}
//
return false;
}
//
return true;
}
bool ClearSemaphore( const char * inName)
{
int retErr = sem_unlink(inName);
if (retErr == -1) {
return false;
}
return true;
}
使用完后还要记得
//使用sem_open方式创建的信号量在使用完毕需清除.
ClearSemaphore("mysem");
Reference:
http://getoffmylawnentertainment.com/blog/2011/06/27/sem_init-function-not-implemented/
http://www.lastrayofhope.com/2011/03/15/ios-semaphore-problems/