在c语言中用信号量同步线程

在c语言中用信号量同步线程,c,C,这段代码是用来创建20个线程的。每个线程生成一个随机字符串,并以alpabet方式对其进行排序。我想要的是如下所示的同步结果 “线程1开始” “线程2开始” “三开始” “线程开始” 并遵循下面的线程临界部分 [0]abcdcdf->abcdefg [1] abcdcdf->abcdefg [2] abcdcdf->abcdefg [19] abcdcdf->abcdefg 线程编号的顺序可以混合,但它 不得遗漏或重叠。以及每一部分 应该划分(线程#n开始和[n]abvdffd->abcdd

这段代码是用来创建20个线程的。每个线程生成一个随机字符串,并以alpabet方式对其进行排序。我想要的是如下所示的同步结果

“线程1开始”

“线程2开始”

“三开始”

“线程开始”

并遵循下面的线程临界部分

[0]abcdcdf->abcdefg

[1] abcdcdf->abcdefg

[2] abcdcdf->abcdefg

[19] abcdcdf->abcdefg

线程编号的顺序可以混合,但它 不得遗漏或重叠。以及每一部分 应该划分(线程#n开始和[n]abvdffd->abcddes)

在这段代码中应该实现什么组件? 如果你能给我看升级后的代码,那将是非常慷慨的

#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)


  • 调试时您发现了什么?发生了什么不应该发生的事情?发生了什么不应该发生的事情?抱歉;;下次我会写得更清楚;;感谢您在我的代码上花费宝贵的时间