-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquestion8.c
167 lines (126 loc) · 2.92 KB
/
question8.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
#include <pthread.h>
uint64_t nb;
FILE * file;
char str[60];
pthread_t thread0;
pthread_t thread1;
//Gérer l'accès critique au file
pthread_mutex_t lock;
//Gérer l'accès critique au screen
pthread_mutex_t lockScreen;
//On code les nombres sur 64 bits donc au pire 64 facteurs (2^0*2¹...)
const int MAX_FACTORS=64;
void print_prime_factors(uint64_t n);
int get_prime_factors(uint64_t n,uint64_t* dest);
void* thread_prime_factors(void * u)
{
pthread_mutex_lock(&lock);
while ( fgets(str, 60, file)!=NULL )
{
nb=atol(str);
pthread_mutex_unlock(&lock);
print_prime_factors(nb);
pthread_mutex_lock(&lock);
}
pthread_mutex_unlock(&lock);
return NULL;
}
void print_prime_factors(uint64_t n)
{
uint64_t factors[MAX_FACTORS];
int j,k;
k=get_prime_factors(n,factors);
pthread_mutex_lock(&lockScreen);
printf("%ju: ",n);
for(j=0; j<k; j++)
{
printf("%ju ",factors[j]);
}
printf("\n");
pthread_mutex_unlock(&lockScreen);
}
int get_prime_factors(uint64_t n,uint64_t* dest)
{
/*****************
* INITIALISATION *
*****************/
int compteur=0; //Garde le nombre de facteurs premiers que l'on rentre dans le tableau
uint64_t i;
/***************
* TESTS POUR 2 *
***************/
while ( n%2 == 0)
{
n=n/2;
dest[compteur]=(uint64_t)2;
compteur++;
}
/***************
* TESTS POUR 3 *
***************/
while ( n%3 == 0)
{
n=n/3;
dest[compteur]=(uint64_t)3;
compteur++;
}
/***************
* TESTS POUR 5 *
***************/
while ( n%5 == 0)
{
n=n/5;
dest[compteur]=(uint64_t)5;
compteur++;
}
/************************************************************
* TESTS POUR LE RESTE DES FACTEURS PREMIERS EN PARTANT DE 7 *
************************************************************/
for( i=7; n!=1 ; i++ )
// On supprime les multiples de 2 et de 3 en incrementant alternativement
// i de 4 et de 2
{
while (n%i==0)
{
// Tant que i est un facteur premier de n
n=n/i;
dest[compteur]=i;
compteur++;
}
}
if(n!=1)
{
dest[compteur]=n;
compteur++;
}
return compteur;
}
int main(void)
{
file = fopen ("fileQuestion10pasEfficace.txt","r");
if (pthread_mutex_init(&lock, NULL) != 0)
{
printf("\n mutex file init failed\n");
return 1;
}
if (pthread_mutex_init(&lockScreen, NULL) != 0)
{
printf("\n mutex screen init failed\n");
return 1;
}
//Attention en C l'appel des méthode est synchrone donc il faut d'abord créer un thread
//avant d'appeler des fonctions dans le main
pthread_create(&thread0, NULL, thread_prime_factors, NULL);
pthread_create(&thread1, NULL, thread_prime_factors, NULL);
//Wait for the thread0 to be done
pthread_join(thread0, NULL);
pthread_join(thread1, NULL);
pthread_mutex_destroy(&lock);
pthread_mutex_destroy(&lockScreen);
return 0;
}