1. A method for synchronizing threads on a multi-threaded processor, comprising: executing instructions from a multi-threaded program using a first thread and a second thread; when the first thread reaches a predetermined location in the multi-threaded program, executing a Start-Transactional-Execution (STE) instruction to commence transactional execution, wherein the STE instruction specifies a location to branch to if transactional execution fails; during transactional execution of the first thread, accessing a mailbox location in memory which is also accessible by the second thread and then executing instructions that cause the first thread to wait; and when the second thread reaches a second predetermined location in the multi-threaded program, signaling the first thread by accessing the mailbox location, which causes the transactional execution of the first thread to fail, thereby causing the first thread to resume non-transactional execution from the location specified in the STE instruction; whereby the second thread can signal to the first thread without the first thread having to poll a shared variable.