在一个线程内循环

时间:2015-05-24 15:54:44

标签: c multithreading cycle

我创建了100个帖子

int i;
pthread_t threads[100];

for(i=0; i<100; i++)
        pthread_create(&threads[i], NULL, analisa, (void*)vetor_local[i]);

但是当我在线程使用的函数内执行此循环时

void* analisa(void* arg)
{
  int i;

  for (i = 0; i < 3; i++)
  {
    char *local1 = (char*) arg;
    passa_automovel((void*) local1);
  }

  pthread_exit(NULL);
}

它只调用函数passa_automovel 100次而不是300次。我在passa_automovel放了一个计数器,它只计算了100个电话。

这是完整的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <pthread.h>
#include <string.h>

#define POSTOS_CONTROLO 100
#define CARROS 300

typedef struct
{
  int velocidade;
  char matricula[20];
  char local[50];
} controlo;

controlo postos_controlo[CARROS];
controlo infracoes[CARROS];
char vetor_local[POSTOS_CONTROLO][50];
pthread_mutex_t mux;
int cont_controlo = 0, cont_infracoes = 0, multas_processadas = 0;
pthread_cond_t cond_multa;

void* passa_multa(void* arg)
{

  /*garantir exclusao mutua no acesso a variavel de condiçao e ao contador*/
  pthread_mutex_lock(&mux);
  while (cont_controlo != cont_infracoes)
    pthread_cond_wait(&cond_multa, &mux);

  infracoes[cont_infracoes] = postos_controlo[cont_controlo];
  multas_processadas++;

  /*liberta zona de exclusao mutua*/
  pthread_mutex_unlock(&mux);

  pthread_exit(NULL );
}

void* passa_automovel(void* arg)
{

  char *local1 = (char*) arg;
  time_t t;
  srand((unsigned) time(&t));
  int i_matricula, velocidade;

  i_matricula = rand() % 900;
  char matricula[15];
  sprintf(matricula, "%d", i_matricula);

  velocidade = rand() % 120;

  /*garantir exclusao mutua no acesso a variavel de condiçao e ao contador*/
  pthread_mutex_lock(&mux);

  postos_controlo[cont_controlo].velocidade = velocidade;
  strcpy(postos_controlo[cont_controlo].matricula, matricula);
  strcpy(postos_controlo[cont_controlo].local, local1);

  if (velocidade > 70)
  {
    cont_infracoes++;
    pthread_cond_signal(&cond_multa);

  }

  cont_controlo++;

  pthread_mutex_unlock(&mux);

  pthread_exit(NULL );
}

void* analisa(void* arg)
{
  int i;
  //char *local1=(char*)arg;

  for (i = 0; i < 3; i++)
  {
    char *local1 = (char*) arg;
    passa_automovel((void*) local1);
  }

  pthread_exit(NULL );
}

int main()
{

  int i;
  pthread_t threads[POSTOS_CONTROLO], multa_thread;

  /*preencher o vetor de locais*/
  for (i = 0; i < POSTOS_CONTROLO; i++)
  {
    char str[15];
    sprintf(str, "%d", i);
    strcpy(vetor_local[i], str);
  }

  pthread_cond_init(&cond_multa, NULL );

  /*lancar postos de controlo (threads)*/
  for (i = 0; i < POSTOS_CONTROLO; i++)
    pthread_create(&threads[i], NULL, analisa, (void*) vetor_local[i]);

  /*criar thread passa multa*/
  pthread_create(&multa_thread, NULL, passa_multa, NULL );

  /*esperar que threads terminem execucao*/
  for (i = 0; i < POSTOS_CONTROLO; i++)
    pthread_join(threads[i], NULL );

  for (i = 0; i < CARROS; i++)
  {
    printf("%d velocidade: %d   matricula: %s      local: %s    \n", i,
        postos_controlo[i].velocidade, postos_controlo[i].matricula,
        postos_controlo[i].local);

    //printf("multas: %d \n", infracoes[i].velocidade);

  }

  printf("multas passadas: %d \n", cont_infracoes);

  return 0;
}

1 个答案:

答案 0 :(得分:4)

知道了。你在passa_automovel中调用pthread_exit。 这样你就可以在第一个循环中杀死线程。 删除它,它的工作原理。