C语言中怎么让一个线程在另外一个线程结束后自启动
时间: 2023-06-05 19:04:30 浏览: 82
可以使用线程的join函数阻塞当前线程,等待另一个线程结束后再执行自启动代码。具体实现参考下面的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
void *thread_func(void *arg) {
printf("子线程执行结束\n");
return NULL;
}
int main() {
pthread_t tid;
// 创建子线程
pthread_create(&tid, NULL, thread_func, NULL);
// 等待子线程结束
pthread_join(tid, NULL);
printf("主线程执行自启动代码\n");
return 0;
}
```
在上面的代码中,主线程创建了一个子线程,在子线程中执行指定函数,然后主线程调用pthread_join函数等待子线程结束。等待结束后,主线程就可以执行执行自启动代码了。
相关问题
用C语言编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
在C语言中,我们可以使用`pthread`库来创建并管理线程。下面是一个简单的示例,展示了如何满足您的需求:
```c
#include <stdio.h>
#include <pthread.h>
#define THREAD_NAME_A "Thread A"
#define THREAD_NAME_B "Thread B"
#define THREAD_NAME_C "Thread C"
void* print_thread_id(void* arg) {
char thread_name[] = (char*)arg;
int count = 0;
while (count < 10) {
printf("%s", thread_name);
if (count < 9)
printf("ABC"[count % 3]); // 用字符串"ABC"循环输出对应字符
count++;
printf("\n"); // 每次打印完换行
sleep(1); // 稍微延时防止瞬间打印太快难以分辨
}
return NULL;
}
int main() {
pthread_t threads[3]; // 创建三个线程的数组
pthread_attr_t attr; // 线程属性
// 初始化线程属性
pthread_attr_init(&attr);
// 设置每个线程的函数和名字
pthread_create(&threads[0], &attr, print_thread_id, THREAD_NAME_A);
pthread_create(&threads[1], &attr, print_thread_id, THREAD_NAME_B);
pthread_create(&threads[2], &attr, print_thread_id, THREAD_NAME_C);
// 启动所有线程
for (int i = 0; i < 3; i++) {
pthread_join(threads[i], NULL); // 等待所有线程结束
}
pthread_attr_destroy(&attr); // 销毁线程属性
return 0;
}
```
在这个程序中,我们首先定义了三个线程的名称常量,然后在`print_thread_id`函数中,线程会打印其名字,并按照ABC的顺序循环输出特定字符。`main`函数则负责创建线程、启动它们并等待它们完成。
注意:为了清晰可见,实际应用中可能需要适当调整`sleep(1)`的时间间隔,以便线程之间的输出不会相互覆盖。
Linux用C语言编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
在Linux环境下,你可以使用C语言中的`pthread`库来创建和管理线程。以下是一个简单的示例,展示了如何创建三个线程并按照指定顺序输出它们的ID:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 定义线程函数
void* print_thread(void* arg) {
char id = (char*)arg;
for (int i = 0; i < 10; i++) {
printf("%c", id);
// 线程操作结束后记得刷新屏幕,但是C标准库不支持这一操作
// printf("\n"); // 这里只是为了演示效果,在实际应用中需要其他方式
}
return NULL;
}
int main() {
pthread_t threads[3]; // 创建三个线程的数组
int thread_ids[] = { 'A', 'B', 'C' }; // 线程ID
// 创建并启动线程
for (size_t i = 0; i < 3; i++) {
pthread_create(&threads[i], NULL, print_thread, &thread_ids[i]);
// 启动线程后睡眠1秒,以便控制输出顺序
sleep(1); // 这里只是为了演示顺序,实际上不需要
}
// 等待所有线程结束
for (size_t i = 0; i < 3; i++) {
pthread_join(threads[i], NULL);
}
printf("All threads finished.\n");
return 0;
}
```
注意:在实际生产环境中,由于C标准库并不直接提供刷新屏幕的功能,这里只是为了演示而加入了一个`printf("\n")`,在真实情况下你需要用其他方式来同步输出(例如信号量、条件变量等)。同时,`sleep(1)`的作用也是为了让线程按照ABC的顺序启动,但在实际项目中不应依赖这个延迟。
阅读全文