Я создал простую программу на С ++, которая используется для регистрации. Я создаю потоки в цикле for, который выполняется 1000 раз в test.cpp
, который является файлом драйвера. pthread_create
вызывает функцию печати в tt.cpp
, которая записывает входной параметр, т.е. i, в file.txt
.
Я хочу синхронизировать темы.
Я пытался использовать pthread_join
, который синхронизировал потоки, но я хочу синхронизировать потоки без использования объединения.
Я знаю, что если поток заблокирован, многие потоки будут ожидать, пока он не будет разблокирован, и после того, как этот поток разблокирован, любой из ожидающих потоков заблокирует функцию. Итак, я попытался использовать статическую целочисленную переменную в tt.cpp
и попытался сравнить ее с входным параметром, чтобы я мог использовать pthread_cond_wait
и pthread_wait_signal
, но у меня возникла ошибка сегментации при сравнении.
/* if(j == *((int *)input)))
This comparison gave me a segmentation fault */
-------------------------test.cpp---------------------------------
#include "thr.h"
pthread_mutex_t loc;
FILE *thePrintFile = NULL;
int main()
{
pthread_mutex_init(&loc,NULL);
pthread_t p;
thePrintFile = fopen("file.txt","r+");
for(int i =0; i<1000;i++)
{
pthread_create(&p,NULL,print,(void *)i);
}
for(int k = 0; k<100000;k++);
/* i have used it to ensure that the main thread
doesn't exit before the pthreads finish writing */
return 0;
}
------------------------tt.cpp------------------------------------
#include "thr.h"
extern pthread_mutex_t loc;
extern FILE *thePrintFile;
void* print(void *input)
{
if(pthread_mutex_trylock(&loc) == 0)
{
fprintf(thePrintFile,"%s%d\n",(int *)input);
fflush(thePrintFile);
pthread_mutex_unlock(&loc);
}
}
-----------------------------thr.h--------------------------------
#ifndef THR_H_INCLUDED
#define THR_H_INCLUDED
void* print(void *input);
#endif
Данный ниже является частью file.txt.
1
5
9
10
11
12
13
14
15
16
18
19
20
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
21
201
202