编写一段代码 将3个线程绑到3个cpu核上,并加锁
时间: 2024-04-14 16:27:59 浏览: 16
以下是一个将3个线程绑定到3个CPU核心并使用互斥锁进行同步的代码示例:
```c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sched.h>
pthread_mutex_t mutex;
void* threadFunc(void* arg) {
int* cpuId = (int*) arg;
int threadId = pthread_self();
cpu_set_t cpuSet;
CPU_ZERO(&cpuSet); // 清空CPU集合
CPU_SET(*cpuId, &cpuSet); // 设置要绑定的CPU核心
if (sched_setaffinity(threadId, sizeof(cpuSet), &cpuSet) == -1) {
perror("绑定CPU核心失败");
exit(EXIT_FAILURE);
}
printf("线程 %lu 绑定到 CPU 核心 %d\n", threadId, *cpuId);
// 在此处编写线程要执行的代码
pthread_mutex_lock(&mutex);
printf("线程 %lu 执行临界区代码\n", threadId);
// 在此处编写需要保护的临界区代码
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t threads[3];
int cpuIds[3] = {0, 1, 2}; // 要绑定的CPU核心编号
if (pthread_mutex_init(&mutex, NULL) != 0) {
perror("初始化互斥锁失败");
exit(EXIT_FAILURE);
}
for (int i = 0; i < 3; i++) {
if (pthread_create(&threads[i], NULL, threadFunc, &cpuIds[i]) != 0) {
perror("创建线程失败");
exit(EXIT_FAILURE);
}
}
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
return 0;
}
```
在上述代码中,我们创建了3个线程,并将每个线程绑定到对应的CPU核心。线程函数 `threadFunc` 接收一个整型指针参数 `arg`,该参数指向要绑定的CPU核心编号。我们使用 `sched_setaffinity` 函数将每个线程绑定到指定的CPU核心上,并输出每个线程所绑定的核心编号。
在 `main` 函数中,我们初始化了一个互斥锁 `mutex`,用于保护临界区代码。在 `threadFunc` 中,我们使用 `pthread_mutex_lock` 和 `pthread_mutex_unlock` 对互斥锁进行加锁和解锁操作,确保只有一个线程可以进入临界区代码。
请注意,在实际的临界区代码中,您需要根据具体的需求进行修改。此示例仅展示了如何使用互斥锁进行线程同步和保护临界区代码。