C语言主线程和子线程通信的代码
时间: 2023-11-12 15:59:15 浏览: 117
在C语言中,主线程和子线程之间可以使用共享内存、信号量、消息队列等方式进行通信。下面是一个使用共享内存进行通信的示例代码:
主线程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
int shmid;
key_t key;
char *shm, *s;
// 创建共享内存
key = ftok(".", 'a');
shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(1);
}
// 将共享内存附加到当前进程中
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1) {
perror("shmat");
exit(1);
}
// 向共享内存中写入数据
strcpy(shm, "Hello, world!");
// 创建子线程
pthread_t tid;
if (pthread_create(&tid, NULL, child_thread, (void *) &shmid) != 0) {
perror("pthread_create");
exit(1);
}
// 等待子线程结束
if (pthread_join(tid, NULL) != 0) {
perror("pthread_join");
exit(1);
}
// 从共享内存中读取数据
for (s = shm; *s != '\0'; s++) {
putchar(*s);
}
putchar('\n');
// 分离共享内存
if (shmdt(shm) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
return 0;
}
```
子线程:
```c
void *child_thread(void *arg) {
int shmid = *(int *) arg;
char *shm, *s;
// 将共享内存附加到当前进程中
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1) {
perror("shmat");
exit(1);
}
// 在共享内存中追加数据
for (s = shm; *s != '\0'; s++) {
*s = toupper(*s);
}
// 分离共享内存
if (shmdt(shm) == -1) {
perror("shmdt");
exit(1);
}
pthread_exit(NULL);
}
```
在这个示例中,主线程和子线程都可以访问同一个共享内存区域,主线程向共享内存中写入数据,子线程将数据转换为大写字母后再追加到共享内存中。最终,主线程从共享内存中读取数据并输出。
阅读全文