That's right. Don't use the same $dbh in more than one process.
If you fetch all rows and don't exit the loop early, there is no need to call finish(). on sth3 and 4, you can either call prepare_cached, or move the prepare to right before the sth2 fetch loop (which would be my preference...even calls to prepare_cached cost something).
It probably won't make a big difference, but bind_columns w/fetch is supposed to be faster.