使用c

时间:2017-03-22 10:38:14

标签: c multithreading synchronization

我正在编写ac程序来创建三个线程(1,2,3),这样在任何给定的时间点只有一个线程必须执行并在控制台上按顺序打印输出123123123123 ........ 。

我正在利用信号量进行同步。

我遇到了我编写的代码问题。代码不按123123的顺序打印...订单是随机的,一段时间后停止。

#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<assert.h>
#include<stdlib.h>

sem_t sem_1;

void *func1(void *arg){

    int err1=0;

    while(1){
            err1=sem_wait(&sem_1);
            assert(err1==0);
            printf("thread 1\n");
    }
    //return NULL;
}

void *func2(void *arg){

   int err2=0;

    while(1){
            err2=sem_wait(&sem_1);
            assert(err2==0);
            printf("thread 2\n");
    }
   // return NULL;
}

void *func3(void *arg){

  int err3=0;

   while(1){
            err3=sem_wait(&sem_1);
            assert(err3==0);
            printf("thread 3\n");
    }
   // return NULL;
}

int main(){

    pthread_t *t1,*t2,*t3;
    int i=0,rc=0,c1=0,c2=0,c3=0;
    t1=(pthread_t *)malloc(sizeof(*t1));
    t2=(pthread_t *)malloc(sizeof(*t2));
    t3=(pthread_t *)malloc(sizeof(*t3));

    i=sem_init(&sem_1,0,1);
    assert(i==0);

    c1=pthread_create(t1,NULL,func1,NULL);
    assert(c1==0);

    c2=pthread_create(t2,NULL,func2,NULL);
    assert(c2==0);

    c3=pthread_create(t3,NULL,func3,NULL);
    assert(c3==0);

    while(1){
            rc=sem_post(&sem_1);
            assert(rc==0);
            sleep(1);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:4)

为什么你甚至会在订单中指望它们?

  • 您的线程在不同的等待之间执行操作,根据系统调度程序,这些可能需要不同的时间。
  • printf是一种缓冲操作,可让您独占访问共享资源。所以除了你的信号量之外,某处还有一个隐藏锁,它还可以调节线程的进度。不要期望打印件按顺序显示,即使这些打印本身也是如此。

然后,最后,在这里使用assert真的是一个非常糟糕的主意。所有sem_t操作都可能(并且将会)虚假失败,因此中止是非常糟糕的,只是因为这样的失败。

事实上,sem_t实际上是一个低级别的工具,如果没有检查返回值,并且如果这样的调用失败,则不应该使用回退策略。

答案 1 :(得分:0)

当然。我看不到任何与订单相关的同步机制。

实现严格顺序的一个选项是每个线程有一个信号量:

 function sum()       {  
    var start = document.getElementById('edit-submitted-start-mileage').value;        
    var end = document.getElementById('edit-submitted-end-mileage').value;   
    var result = parseInt(start) + parseInt(end);    
     if (!isNaN(result)) {   
       document.getElementById('edit-submitted-total-miles').value = result;  
         }  
    }