Keeping up the beating of the ‼XXMangled Horse CorpseXX‼...
Going to 64 bits shouldn't be incredibly difficult, as it's mostly a matter of changing compiler switches, although care will be needed to ensure data types are changed to larger ones when appropriate (with the attendant adjustments of any pointer offset access to data). 64 bits won't provide much in itself, as it mainly allows DF not to crash when requiring more than 2 GB memory, but instead continue to crawl at 0.1 FPS. 64 bits is basically an enabler, like a sturdier foundation allowing you to build a higher house.
Multi threading, however, is a completely different matter altogether. It's not insanely difficult to do when implemented from scratch and basic discipline is maintained, but retrofitting something not intended for it is a fair bit more complicated. Let's try a DF analogy:
In this DF mock system we can order the production of a loaf of bread, and, as e.g. digging orders in the real DF, tasks are given in a priority order and allocated in that order. Urist McHermit is given the following tasks with the following priorities:
1. Harvest wheat (and store it in the food stockpile).
2. Pick up wheat from the food stockpile and mill it into flour.
3. Store wheat flour in the food stockpile.
4. Pick up flour from the food stockpile and take it to the kitchen to make a loaf of bread.
5. Store the bread in the food stockpile.
6. Pick up the bread from the food stockpile and eat it in the tavern.
In the multi threaded case Urist McOne harvests the wheat, while Urist McTwo, Urist McThree, Urist McFour, and Urist McFive all "cancel task, no source material". And finally Urist McOne "cancel task - no bread".
In multi threading you have to ensure everything that's dependent on things happening in a specific order actually are performed in that order, delaying dependent jobs until the preconditions are met. Sometimes you might not care which order things are happening in (regular wear of a ¤sock¤ vs wear of that same sock due to burning), and sometimes they're not related at all (King of fortress Distant ordering the execution of the Liaison in spring and the harvest of plump helmets in Fortress Local during the same tick. The former should affect Fortress Local only when the news reaches the fortress MANY ticks later, although you may give engravers the liberty of knowing, but then you have to take care the engravers aren't reading data that's only partially written). With multi threading you also have to ensure data protection, i.e. that one thread isn't affecting a piece of data while another one is reading it. If we take the !¤sock¤! above, it doesn't really matter if the wear due to fire or wear is applied first, but it does matter if its done as:
- Burn thread: Read current !¤sock¤! wear.
- Wear thread: Read current !¤sock¤! wear.
- Burn thread: Subtract burn damage wear from !¤sock¤! and write it back.
- Wear thread: Subtract wear from !¤sock¤! and write it back.
In this case the burn damage is lost, because the wear thread overwrote the results from the burn damage. This can be even worse if the !¤sock¤! gets destroyed, so the burn thread removes the now ex ¤sock¤ from the game, and the memory used by that ¤sock¤ is reused to store some completely different data altogether, like a pointer to the list of items in a new migrant's inventory. When the wear thread writes the !¤sock¤! wear it now overwrites a pointer with a wear value, and DF will probably terminate the next time it tries to access the migrant inventory list, as the pointer is corrupted and doesn't point to any legal memory in DF at all.
I'd try to explain what's said by others above. If the friend isn't interested in listening, just stop mentioning DF to him, as it's obviously a subject there's no point in discussing.