Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何同步线程?_C_Unix_Synchronization_Pthreads - Fatal编程技术网

C 如何同步线程?

C 如何同步线程?,c,unix,synchronization,pthreads,C,Unix,Synchronization,Pthreads,我在这段代码中使用了线程。但是当我在shell中执行这段代码时,一些线程没有打印这一行 printf("\ti'm %dth thread:)", j); printf("\t%c %d %d %d \n", arr[j].op, arr[j].byte, seq, no_file); 此外,甚至有些线程也会将该行打印两次。这个过程发生了什么?如何重新组织代码,以便线程只打印一次行 #include <stdio.h> #include <stdlib.h>

我在这段代码中使用了线程。但是当我在shell中执行这段代码时,一些线程没有打印这一行

printf("\ti'm %dth thread:)", j);  
printf("\t%c  %d  %d  %d \n", arr[j].op, arr[j].byte, seq, no_file);
此外,甚至有些线程也会将该行打印两次。这个过程发生了什么?如何重新组织代码,以便线程只打印一次行

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>

typedef struct {char op; int byte; int seq; int no_file; } ARRAY; 

ARRAY *arr;

void *thread_operation(void *arg){
    int j =*((int*)arg);
    seq = arr[j].seq;
    int no_file = arr[j].no_file;
    printf("\ti'm %dth thread:)", j);
    printf("\t%c  %d  %d  %d \n", arr[j].op, arr[j].byte, seq, no_file);
}

int main()
{
    int err, j, i = 10;
    long int tid;
    arr = (ARRAY*)malloc(sizeof(ARRAY) * i);
    srand(time(NULL));
    for (i = 0; i <= 10; i++){
        arr[i].op = 'r';
        arr[i].byte = (rand() % 10);
        arr[i].seq = i;
        arr[i].no_file = i + 10;
}

    for(j = 0; j < 10; j++){
        printf("creating %dth thread.....", j);
        err = pthread_create(&tid, NULL, thread_operation, &j);
        if(err != 0)
        printf("%s\n", strerror(err));
        printf("%dth done\n", j);
    }

    return 0;
}

您需要使用互斥来避免竞争条件,并且还需要使用pthread_join在进程死亡之前同步所有线程

互斥锁允许您在其中一个线程使用共享资源执行操作时停止某些线程(请参阅man pthread_mutex_lock,pthread_mutex_init)


pthread_join在代码中是必不可少的,因为它迫使主线程等待您创建的其他线程,如果您不使用它,则无法确定当主线程从主线程返回时所有线程都将完成。

使用
printf
,线程之间的行不完整通常不起作用。您可能会将输出完全损坏。另外,行在屏幕上的显示顺序通常不是执行顺序,而是线程访问共享资源的顺序
stdout

一些行打印两次(例如线程编号9)的原因是,您将循环变量的指针作为线程操作的输入传递

for(j = 0; j < 10; j++){
    err = pthread_create(&tid, NULL, thread_operation, &j);<---here
在线程中,将thread参数的值抛出:

int j =(int)arg;
从技术上讲,这取决于这样一个事实,即
int
void*
的大小是相同的,而通常情况下它们不是相同的。但只要您不使用giant
int
值,这就可以工作


对于所有其他问题,@Intrepidd使用pthread_join来确保进程在所有线程完成之前不会退出是正确的。

谢谢。。为什么一些线程(在上面的例子中,第九个线程)被两次调用?竞争条件会导致一个未定义的行为,请考虑验证我的答案:
void *thread_operation(void *arg){
    int j =*((int*)arg);<---here
pthread_create(&tid, NULL, thread_operation, (void*) j);
int j =(int)arg;