CocoaDev

Edit AllPages

Pages in this topic: [Topic]

When writing a General/MultiThreaded application, there are several issues that you need to be aware of: http://goo.gl/Cx9sQ

In order to preserve General/ThreadSafety, you can send everything you use a retain message, you can employ an General/AutoReleasePool and General/AutoRelease objects, or you can use the concept of General/WeakReferences to avoid General/RetainCycles.

**see also: ** General/CanTwoThreadsLockFocusOnTheSameView

I know for a fact that updating an General/NSTextView from a worker thread is unsafe. I know for a fact that working with icons (via General/NSWorkspace) in a worker is unsafe. I strongly suspect all menu operations are unsafe. Pending more complete documentation, I’d assume everything in General/AppKit is unsafe unless told otherwise (such as drawing and other topics touched on in the release note).

http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/articles/General/CocoaSafety.html

http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/articles/General/CarbonSafety.html

Find some trivial examples in:

/Developer/Documentation/Cocoa/Reference/Foundation/ObjC_classic/Classes/General/NSConnection.html

You can use its code snippets to implement a simple client/server that uses mach messages to pass messages. To aid development, build the server into an Application (so General/AppKit manages the run loop for you) and create a command-line tool client or an Application client, whichever is easier. That should give you a leg-up on writing us some sample code ;-).

When making your app thread-safe, General/NSConnection.html again suggests using mach-ports, and illustrates exactly how to do it. I was able to just plug it into an existing project of mine.

There are some less-elementary examples of using DO on TCP/IP on the system here:

/Developer/Examples/Foundation/

See also

/Developer/Examples/Foundation/General/MultitThreadedDO

Thomas Lachand-Robert also wrote a whole page about communication between threads, and in particular to General/AppKit: http://lachand.free.fr/cocoa/Threads.html Don’t hesitate to send him any suggestions for additions or changes.


I also added some General/DistributedObjectsSampleCode from the General/MacOsxDev list.

– General/StevenFrank


This recent post from General/MacOsxDev may also be of interest:

From: Toby Paterson tpater@mac.com Subject: Inter-thread messaging: a solution

The topic of how to communicate between two threads efficiently has come up a number of times while I’ve been on this list. I’ve written some code to facilitate this and am making it available for your use and abuse.

The model expects that you have one or more worker threads that need to post information back to the main, UI thread, though it can be used to communicate with any thread running a run loop. It takes the form of categories on General/NSObject and General/NSNotificationCenter to allow you to invoke methods and post notifications in a specific thread:

 [master performSelector:@selector(workerDone:)
         withObject:self
         inThread:mainThread];

 General/[[NSNotificationCenter defaultCenter]
     postNotificationName:kSomethingHappened
     object:self
     inThread:mainThread
     beforeDate:General/[NSDate distantFuture]];

The implementation uses General/NSPortMessages to marshall the message to the target thread. It’s more light-weight than DO - General/NSPortMessage and General/NSPort are a fairly thin veneer on top of mach messaging - but not nearly as general. Make sure you read the comments in the header for some caveats of the argument marshalling.

You can download it from:
http://homepage.mac.com/tpater/General/InterThreadMessaging.dmg

I’m releasing this code in to the public domain: use it; modify it; ship it in free or commercial software; just don’t expect any support nor assign to me any blame if using this code causes you any mental or physical harm. Have fun.

– General/StevenFrank

The above page is no longer up, but i have mirrored the code. See General/InterThreadMessaging. – General/DustinVoss


I have made a utility class, General/FDObjectiveMethod, that allows you to treat a method as an object. You initialize it with a complete (and that part is important, because if it’s incomplete, you’ll get errors) General/NSInvocation, and then start it with the -execute method. You can halt it part way through with the -stopExecution method.

It runs the invocation in a separate thread, so you don’t have to worry about that.

It’s here on General/CocoaDev, on the General/ObjectiveMethod page.

– General/RobRix

(It’s also a better idea to use General/ThreadWorker. General/FDObjectiveMethod has fallen by the wayside. – General/RobRix)


Just starting some rewriting. – General/KritTer