我正在学习在C中使用线程,我想制作一个可以同时制作2件事情的程序,我认为这就是并行的定义。所以我用下面的代码创建线程:
pthread_t threads[NUM_THREADS];
int rc, rc_2;
int i;
for( i = 0; i < NUM_THREADS; i++ ) {
printf("main() : creating thread, %dn", i);
rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i);
rc_2 = pthread_create(&threads[i], NULL, PrintHello_2, (void *)i);
if (rc || rc_2) {
printf("Error:unable to create thread, %dn", rc);
exit(-1);
}
}
每个线程调用一个函数:
void *PrintHello(void *threadid) {
long tid;
tid = (long)threadid;
printf("Hello World! Thread ID, %dn", tid);
printf("Valores a: %d, b: %dn", a,b);
a += 5;
pthread_exit(NULL);
}
void *PrintHello_2(void *threadid) {
long tid;
tid = (long)threadid;
printf("Hello World! Thread ID, %dn", tid);
printf("Valores a: %d, b: %dn", a,b);
b += 3;
pthread_exit(NULL);
}
我有两个全局变量a和b,我只是把它们相加5和3来显示它们是如何变化的。但问题是,我不明白如果这是并行…如果不是,我怎么能看到这两个函数或操作在同一时间做他们的代码?因为当我输出a和b的值时,它看起来就像一个正常的程序。
main()
在线程有机会运行任何时间之前退出。pthread_join()
将等待main()
中的线程退出。另一个问题是,您的线程不是特别长时间运行。我通过运行一个长循环来修复这个问题。还修复了int被传递给线程但读取长。
#include <limits.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NUM_THREADS 2
void *PrintHello(void *threadid) {
int tid = *(int *) threadid;
for(int i = 0; i < INT_MAX; i += tid + 1) {
printf("%d %dn", tid, i);
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int ids[NUM_THREADS];
for(int i = 0; i < NUM_THREADS; i++ ) {
ids[i] = i;
printf("main() : creating thread, %dn", i);
int rc = pthread_create(&threads[i], NULL, PrintHello, &ids[i]);
if (rc) {
printf("Error:unable to create thread, %dn", rc);
exit(-1);
}
}
for(int i = 0; i < NUM_THREADS; i++ ) {
pthread_join(threads[i], 0);
}
}
,然后输出如下内容:
1 166
0 265
0 266
1 168
0 267
1 170
1 172
1 174
1 176
1 178
0 268
输出流必须有互斥对象,否则两个线程会产生混乱的输出。