Multi-core vs. Multi-threaded are distinctly different and require more thought and careful synchronisation/resource protection.

The reason... concurrency, and here's why...

Code:
Single Core

Thread 1 XXXX----XXX--------XX
Thread 2 ----XXXX---XXXXXXXX--
Using my really great artwork, what we have above is a simple diagram to illustrate the scheduling of two threads in your app on a single core machine.

As you can see, processing switches between the threads, meaning that at times they will not be executing.
Code:
Multi Core

Thread 1 XXXXXXXXXXXXXXXXXXXXXXX
Thread 2 XXXXXXXXXXXXXXXXXXXXXXX
This diagram shows the scheduling of the same two threads, but this time running on a dual core machine. As you can see, both threads are being executed at the same time because thread 1 is on core 1 and thread 2 is on core 2.

Whilst the essence of protecting for multi-core is similar to protecting for multi-threaded, you have to be more mindful of such wonders as deadlock and other timing induced weirdness such as AV's on variables you know you've initialised.

If anyone is new to multithreading and wants some pointers, I did write an article (Multi-threading Part 1 ) about the basics of multi-threading.