我创建了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;
}
答案 0 :(得分:4)
知道了。你在passa_automovel中调用pthread_exit。 这样你就可以在第一个循环中杀死线程。 删除它,它的工作原理。