Область действия sparam в цикле for является статической в этом цикле. Когда вы устанавливаете .a и .b, вы снова и снова пишете в одну и ту же структуру, и все три потока получают указатель на одну и ту же структуру.
Вместо этого вы можете создать три отдельных экземпляра структуры, сделав их массив таким образом ..
int main(int argc, char **argv)
{
pthread_t thread[3];
s_param param[3];
int rc=0,i;
void * status;
for(i=0; i<3 ; ++i){
param[i].b=10;
param[i].a=i;
rc = pthread_create(&thread[i], NULL, threadfunc, ¶m[i] ); // !!!!
if(rc){
exit(1);
}
}
... etc
Следует отметить, что создание структур (и потоков) в массиве, подобном этому, возможно только потому, что вы явно выполняете join () с основным потоком. Если вы не сделали этого объединения, вам бы посоветовали либо статически распределить структуры вне основной функции, либо распределить их по малой части из кучи, потому что, как только поток ввода выходит из основной функции, кадр стека, содержащий массив станет недействительным и вскоре будет перезаписан непредсказуемым образом.