Hello everybody , I had bought <<Linux Programming Unleashed Edition
2>> . The day before yesterday I compiled thrdcancel.c (charpter 14) with gcc 3.2.2 on Redhat 9 but found the program didn't work as we guess. I did't change a word in thrdcancel.c ,
It's output is:
task1 count: 0
task2 count: 0
task2 count: 1
task2 count: 2
task2 count: 3
task2 count: 4
task1 count: 1
total iterations: 6
but it's output should be:
task1 count: 0
task2 count: 0
task2 count: 1
task2 count: 2
task2 count: 3
task2 count: 4
task1 count: 1
task1 count: 2
task1 count: 3
task1 count: 4
total iterations: 10
Here is source code:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
void task1(int *counter);
void task2(int *counter);
void cleanup(int counter1,int counter2);
int g1 = 0;
int g2 = 0;
int main(int argc, char *argv[])
{
pthread_t thrd1,thrd2;
int ret;
//create the first thread
ret = pthread_create(&thrd1,NULL,(void*)task1,(void*)&g1);
if(ret)
{
perror("pthread_create:task1");
exit(EXIT_FAILURE);
}
//create the second thread
ret = pthread_create(&thrd2,NULL,(void*)task2,(void*)&g2);
if(ret)
{
perror("pthread_create:task2");
exit(EXIT_FAILURE);
}
pthread_join(thrd2,NULL);
//cancel the first thread
pthread_cancel(thrd1);
pthread_join(thrd1,NULL);
cleanup(g1,g2);
exit(EXIT_SUCCESS);
}
void task1(int *counter)
{
//Disable thread cancellaion
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
while(*counter < 5)
{
printf("task1 count: %d\n",*counter);
(*counter)++;
sleep(1);
}
//Enable thread cancellation
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
}
void task2(int *counter)
{
while(*counter < 5)
{
printf("task2 count: %d\n",*counter);
(*counter)++;
}
}
void cleanup(int counter1,int counter2)
{
printf("total iterations: %d\n", counter1 + counter2);
}
Obviously thread 1(task1) was killed even after pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL); called.
It should not be killed.
I don't know why the code don't work on Redhat 9. Can you tell me how to rewrite the code to let it work as we hope ?
Thanks in advance.