c语言写代码对于共享变量 counter,当线程间没有任何约束时,分别完成累加操作
时间: 2023-05-20 14:02:35 浏览: 127
可以使用互斥锁或原子操作来保证线程安全,避免出现竞争条件。以下是使用互斥锁的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 10
int counter = 0;
pthread_mutex_t mutex;
void *thread_func(void *arg) {
int i;
for (i = 0; i < 100000; i++) {
pthread_mutex_lock(&mutex);
counter++;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int i;
pthread_mutex_init(&mutex, NULL);
for (i = 0; i < NUM_THREADS; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("counter = %d\n", counter);
pthread_mutex_destroy(&mutex);
return 0;
}
```
这里创建了 10 个线程,每个线程执行 10 万次累加操作,最后输出 counter 的值。使用互斥锁保证了线程安全。
对于原子操作,可以使用 GCC 内置的 __sync 系列函数,如 __sync_fetch_and_add()。以下是使用原子操作的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 10
int counter = 0;
void *thread_func(void *arg) {
int i;
for (i = 0; i < 100000; i++) {
__sync_fetch_and_add(&counter, 1);
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int i;
for (i = 0; i < NUM_THREADS; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("counter = %d\n", counter);
return 0;
}
```
这里也创建了 10 个线程,每个线程执行 10 万次累加操作,最后输出 counter 的值。使用原子操作保证了线程安全。
阅读全文