在c语言中用信号量同步线程
这段代码是用来创建20个线程的。每个线程生成一个随机字符串,并以alpabet方式对其进行排序。我想要的是如下所示的同步结果 “线程1开始” “线程2开始” “三开始” “线程开始” 并遵循下面的线程临界部分 [0]abcdcdf->abcdefg [1] abcdcdf->abcdefg [2] abcdcdf->abcdefg [19] abcdcdf->abcdefg 线程编号的顺序可以混合,但它 不得遗漏或重叠。以及每一部分 应该划分(线程#n开始和[n]abvdffd->abcddes) 在这段代码中应该实现什么组件? 如果你能给我看升级后的代码,那将是非常慷慨的在c语言中用信号量同步线程,c,C,这段代码是用来创建20个线程的。每个线程生成一个随机字符串,并以alpabet方式对其进行排序。我想要的是如下所示的同步结果 “线程1开始” “线程2开始” “三开始” “线程开始” 并遵循下面的线程临界部分 [0]abcdcdf->abcdefg [1] abcdcdf->abcdefg [2] abcdcdf->abcdefg [19] abcdcdf->abcdefg 线程编号的顺序可以混合,但它 不得遗漏或重叠。以及每一部分 应该划分(线程#n开始和[n]abvdffd->abcdd
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <stdlib.h>
#include <semaphore.h>
#define num_thread 20
char str[11]; //Global variable shared to threads
void *thread_work(void *tid);//Main body of Thread Working
void generate_str(int n); //Create a random character array
void str_sort(int n); //Sorting the char array alpabetically
void check_sort(void);
void print_time(struct timespec *myclock);
void print_time_start(struct timespec *myclock);
void print_time_end(struct timespec *myclock);
sem_t my_sem;
int main(void)
{
pthread_t tid[num_thread];
int ret;
int t;
struct timespec myclock[2];
srand(time(NULL)); //changes string value of each execution of program
ret = sem_init(&my_sem, 0, 1);
clock_gettime(CLOCK_REALTIME, &myclock[0]);
print_time_start(myclock);
for(t=0; t<num_thread; t++)
ret = pthread_create(&tid[t], NULL, thread_work, (void *)&t);
for(t=0; t<num_thread; t++)
ret = pthread_join(tid[t], NULL);
clock_gettime(CLOCK_REALTIME, &myclock[1]);
print_time_end(myclock);
sem_destroy(&my_sem);
return 0;
}
void *thread_work(void *t)
{
int n = *((int *)t);
struct timespec myclock[2];
printf("########## Thread #%d starting ########## \n",n);
sem_wait(&my_sem); //Entry Section
clock_gettime(CLOCK_REALTIME, &myclock[0]); //Critical Section Start
generate_str(n);
str_sort(n);
check_sort();
clock_gettime(CLOCK_REALTIME, &myclock[1]);
print_time(myclock); //Critical Section End
sem_post(&my_sem); //Exit Section
#包括
#包括
#包括
#包括
#包括
#定义num_线程20
char-str[11]//共享给线程的全局变量
无效*螺纹工程(无效*tid)//螺纹加工主体
void生成_str(int n)//创建一个随机字符数组
无效stru排序(int n)//对字符数组进行标记排序
作废检查\排序(作废);
无效打印时间(struct timespec*myclock);
无效打印\u时间\u开始(结构timespec*myclock);
无效打印时间结束(struct timespec*myclock);
扫描我的扫描电镜;
内部主(空)
{
pthread_t tid[num_thread];
int ret;
int t;
结构timespec myclock[2];
srand(time(NULL));//更改程序每次执行的字符串值
ret=sem_init(&my_sem,0,1);
clock_gettime(clock_REALTIME,&myclock[0]);
打印时间和开始时间(myclock);
对于(t=0;t请执行以下更改
#包括//usleep(1);
for(t=0;t
{
//传递t的值而不是地址
ret=pthread_create(&tid[t],NULL,thread_work,(void*)t);
usleep(1);//需要睡眠来维持线程启动顺序;
}
int n=(int)t;//而不是int n=*((int*)t);
如果在pthread_create中传递t的地址,则在线程获取调度时,t的值将由主线程更改
在线程创建循环之前锁定信号量,sem\u wait(&my\u sem)
,并在main()中的线程创建循环之后解锁(sem\u post(&my\u sem)
)
调试时您发现了什么?发生了什么不应该发生的事情?发生了什么不应该发生的事情?抱歉;;下次我会写得更清楚;;感谢您在我的代码上花费宝贵的时间