Они не одно и то же.
«Аргумент out» получает идентификатор процесса. Возвращаемым значением является идентификатор потока.
Реальный вопрос заключается в том, почему два отдельных механизма «дают мне ценность» используются вообще. Вы могли бы подумать, что два «аргумента» могут быть более последовательными.
Ответ: люди. Мы совершаем ошибки. Мы создаем противоречивые API. Это случается.
Кто-то решил, что для возврата нет кода ошибки, поэтому вы также можете использовать возвращаемое значение. Но, к сожалению, нам нужно что-то еще вернуть, а в C нет кортежей, поэтому давайте вместо этого будем использовать аргумент out.
Мы иногда называем такие вещи "историческими причинами". Ваш пробег может отличаться.
Я могу сказать вам, что лично я не разработал бы эту функцию, скажем, в современном C ++. Но это сейчас, в 2018 году, и я не делаю операционные системы (oof, вы можете себе представить? ??).
В конце концов, честно говоря, никакого вреда не было.