QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 987|回复: 4

请大家看看这个线程 的初级程序,我搞不懂

[复制链接]
发表于 2005-10-4 20:42:58 | 显示全部楼层 |阅读模式
[code:1]#include <stdio.h>
#include <stdlib.h>
#include <unistd.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);
    pthread_cancel(thrd1); /* Cancel the first thread */
    pthread_join(thrd1, NULL);
   
    cleanup(g1, g2);

    exit(EXIT_SUCCESS);
}

void task1(int *counter)
{
    /* Disable thread cancellation */
    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);
}
书上应该得到的结果是
  
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
但我得到的确是
task1 count: 0
task2 count: 0
task2 count: 1
task2 count: 2
task2 count: 3
task2 count: 4
task1 count: 1
total iterations: 6
我想也应该是第一种结果,但我编译运行却是第二个,哪位大虾解释一下.[/code:1]
发表于 2005-10-5 22:56:36 | 显示全部楼层
pthread_cancel(thrd1); /* Cancel the first thread */
这句好像没什么用,而且会破坏线程1的运行。
回复

使用道具 举报

 楼主| 发表于 2005-10-6 14:34:40 | 显示全部楼层
再说说
回复

使用道具 举报

发表于 2005-10-6 16:09:42 | 显示全部楼层
task1里有延时,task2没有延时,task2完成时task1可能才完成一个累加。
因为task2线程执行完毕后,pthread_join(thrd2, NULL)就不再等待了,pthread_cancel(thrd1); 马上被执行,thrd1被取消,此时task1可能才完成一个累加,因为延时1秒时间太长了。

不管有没有延时,在pthread_join中间放一个pthread_cancel(thrd1); 是逻辑上的错误。
回复

使用道具 举报

 楼主| 发表于 2005-10-9 08:38:09 | 显示全部楼层
哦,明白了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 01:57 , Processed in 0.070574 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表