创建多个线程,通过数值间隔判断质数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define L_NUM 0
#define R_NUM 200
#define N 3
static void *func(void *arg)
{
int n, flag = 0;
int i, j;
char num[20];
n = *(int *)arg;
for (j = (L_NUM + n); j < R_NUM; j += N) {
flag = 0;
for (i = 2; i <= j/2; i++) {
if (j % i == 0) {
flag = 1;
break;
}
}
if (flag == 0 && j >= 2) {
sprintf(num, "[%d] %d是质数\n", n, j);
write(STDOUT_FILENO, num, strlen(num));
}
}
pthread_exit(arg);
}
int main(int argc, char **argv)
{
int i, j, result;
pthread_t tid[N];
int *p;
void *ret;
for (i = 0; i < N; i++) {
p = calloc(1, sizeof(int));
*p = i;
result = pthread_create(&tid[i], NULL, func, p);
if (result != 0) {
for (j = 0; j < i; j++) {
pthread_join(tid[j], &ret);
free(ret);
}
exit(1);
}
}
for (j = 0; j < N; j++) {
pthread_join(tid[j], &ret);
free(ret);
}
exit(0);
}
创建多个线程,通过主线程分发任务、线程竞争来判断质数
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define N 3
#define L_NUM 20000000
#define R_NUM 20003000
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static int num = 0;
static void *func(void *arg)
{
int i, j, flag;
while (1) {
pthread_mutex_lock(&mutex);
while (num == 0)
pthread_cond_wait(&cond, &mutex);
if (num < 0) {
pthread_mutex_unlock(&mutex);
break;
}
j = num;
num = 0;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
flag = 1;
for (i = 2; i <= j/2; i++) {
if (j % i == 0) {
flag = 0;
break;
}
}
if (flag && (j > 1))
printf("[%d] %d是质数!\n", *(int *)arg, j);
}
pthread_exit(arg);
}
int main()
{
int i;
pthread_t tid[N];
int *tid_num;
void *ret;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
for (i = 0; i < N; i++) {
tid_num = calloc(1, sizeof(int));
*tid_num = i;
pthread_create(&tid[i], NULL, func, tid_num);
}
for (i = L_NUM; i < R_NUM; i++) {
pthread_mutex_lock(&mutex);
while (num != 0)
pthread_cond_wait(&cond, &mutex);
num = i;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
pthread_mutex_lock(&mutex);
while (num != 0)
pthread_cond_wait(&cond, &mutex);
num = -1;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
for (i = 0; i < N; i++) {
pthread_join(tid[i], &ret);
free(ret);
}
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
exit(0);
}