用目标c实现线程锁

时间:2013-02-18 10:42:04

标签: java objective-c multithreading locking

我正在使用最新的SDK开发iOS 5及更高版本。

我必须在Objective C中使用Thread Lock实现同步方法。

这是我必须做的Java版本:

public abstract class MyClass 
{
    [ ... ]

    private static Object dataLock = new Object();

    public static long dataId = 0;

    [ ... ]

    public static void PostData(byte[] data)
    {
        synchronized (MyClass.getDataLock())
        {
            dataId++;
            MyClass.getDataLock().notify();
        }
    }

    public static byte[] GetData()
    {
        synchronized (MyClass.getDataLock())
        {
            try
            {
                MyClass.getDataLock().wait();
            }
            catch (InterruptedException ex)
            {}

            return MyClass.getData();
        }
    }

    [ ... ]
}

如何在Objective C中实现dataLock?作为NSObject
如何在Objective C中执行PostDataGetData方法?

2 个答案:

答案 0 :(得分:3)

使用NSCondition课程。 E.g:

static NSCondition* g_dataLock = nil;

...

+ (void)initialize
{
    if (self == [MyClass class])
    {
        g_dataLock = [NSCondition new];
    }
}

+ (void)postData:(NSData*)data
{
    [g_dataLock lock];
    dataId++;
    [g_dataLock signal];
    [g_dataLock unlock];
}

+ (NSData*)getData
{
    NSData* data = nil;

    [g_dataLock lock];
    [g_dataLock wait];

    data = ...

    [g_dataLock unlock];

    return data;
}

有关详细信息,请参阅Thread Programming Guide

答案 1 :(得分:0)

您可以在这里使用@synchronized(dataLock){...代码...},但这不是here所述的最快方式。