使用多线程增加变量的值

时间:2016-11-02 14:16:32

标签: c multithreading variables

我试着编写一个包含2个线程的代码,它应该将2个数字x y递增到100,每次增量发生时,都应打印出来。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *inc_x(void *x_void_ptr){
   int *x_ptr = (int *)x_void_ptr;
   while (++(*x_ptr)<100) {
      printf("x increment to %d \n",*x_ptr);
      *x_ptr++;
   }
   return NULL;

}

void *inc_y(void *y_void_ptr){
   int *y_ptr = (int *)y_void_ptr;
   while (++(*y_ptr)<100) {
       printf("y increment to %d \n",*y_ptr);
       *y_ptr++;
   }
   return NULL;
}

int main()
{
    int x = 0;
    int y = 0;
    printf("x: 0 , y : 0\n");
    pthread_t inc_x_thread, inc_y_thread;
    if (pthread_create(&inc_x_thread, NULL, inc_x, &x)) {
        fprintf(stderr, "Error creating thread \n");
        return 1;
    }
    if (pthread_create(&inc_y_thread, NULL, inc_y, &y)) {
        fprintf(stderr, "Error creating thread \n");
        return 2;
     }
    printf("%d , %d" , x,y);

    return 0;
}

但是我的x,y值没有增加。有人可以告诉我为什么吗?谢谢(顺便说一下,我是C的新手)。

2 个答案:

答案 0 :(得分:5)

没有同步发生。特别是,你没有pthread_join()线程。

这意味着,在您尝试打印结果时,线程甚至都不会运行。他们可能已经跑了,但你无法确定。

另外,请参阅@mch上面的评论:你根本没有递增计数器,添加到上一个。所以即使线程确实运行,结果也不是你想要的。

为了正确操作,通常,您应该发出条件变量信号(并在消费线程上等待它)以确保结果准备就绪,或者在访问结果之前加入线程。发信号通知条件变量的重量级较小,因此您需要对重复的任务执行什么操作,而不是产生/加入数千个线程。

(在某些情况下,人们可以在线程之间使用原子操作成功共享数据,但这对于线程初学者来说太先进了。太容易让你的生活对此非常不满意,现在就保持cond vars。)

您通常希望确保不会忘记&#34;程序退出时线程仍然在运行,这是调用pthread_join的另一个好理由,即使你对同步不太感兴趣。

你可能倾向于认为它并不重要,因为程序无论如何都会退出,有时甚至是真的。但总的来说,这种假设是无效的。你可以,例如因为线程在操作过程中突然被杀死,所以很难将文件中的垃圾写入或写入半文件 或者你可能有一个工作线程段错误,而操作系统突然拉开它仍然从它脚下访问的内存页面。哪个&#34;看起来&#34;完全正常,除非它没有。

答案 1 :(得分:1)

在检查x和y的反射值之前在main中使用以下:

    pthread_join(inc_x_thread, NULL);
    pthread_join(inc_y_thread, NULL);

在递增时使用这两个函数:(* y_ptr)++;

    void *inc_y(void *y_void_ptr){
    int *y_ptr = (int *)y_void_ptr;
    while (++(*y_ptr)<100) {
    printf("y increment to %d \n",*y_ptr);
    (*y_ptr)++;  // correction here
    }
    return NULL;
    }