Multi-core Programming: Increasing Performance Through Software Multi-threading