PThread Create 不创建线程
PThread Create doesn't create a thread
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "pthread.h"
#include "semaphore.h"
FILE * f;
sem_t * s1;
sem_t * s2;
int check;
int v1;
int v2;
int i;
static void * client (void *arg){
sem_getvalue(s1, &v1); printf("Client pre wait(S1) in S1 => S1 = %d\n",v1);
sem_wait(s1);
printf("client works...\n");
check = sem_getvalue(s1, &v1); printf("Client.wait(S1) in S1 => S1 = %d\n",v1);
if(check != 0) printf("sem_getvalue error");
return 0;
}
int main(void){
pthread_t tidc;
pthread_t tids;
int rc;
int rs;
//Semaforo 1
s1 = (sem_t *) malloc(sizeof(sem_t));
check = sem_init (s1, 0, 2);
if (check != 0) perror("s1_init failed");
sem_getvalue(s1, &v1);
printf("Create the semaphores: S1 = %i\n",v1 );
sem_wait(s1);
printf("main waits\n");
sem_getvalue(s1, &v1); printf("Main.wait(S1) in S1 => S1 = %d\n",v1);
rc = pthread_create (&tidc, NULL, client, 0);
printf(" thread created ==> rc= %i\n",rc);
return 0;
}
它returns这个输出:
Create the semaphores: S1 = 2
main waits
Main.wait(S1) in S1 => S1 = 1
thread created ==> rc= 0
有时这样:
Create the semaphores: S1 = 2
main waits
Main.wait(S1) in S1 => S1 = 1
thread created ==> rc= 0
Client pre wait(S1) in S1 => S1 = 1
Client pre wait(S1) in S1 => S1 = 1
client works...
Client.wait(S1) in S1 => S1 = Client.wait(S1) in S1 => S1 = 0
似乎有时会创建两个线程,有时不会创建一个。我用 gcc prog.c -lpthred
甚至 gcc -pthread prog.c
编译
如果多线程程序从一次执行到另一次执行不做同样的事情,可能是因为未初始化的变量(如在非线程程序中),但也可能是因为 race condition .
在那种情况下,竞争条件是在线程执行和程序退出之间。
由于您在创建线程后立即退出主线程,因此线程被终止 (main thread exit, does other exit too?)。有时,线程有时间做一些事情,这取决于 OS 状态和负载。
如果您添加一些实际处理、长时间延迟或调用 pthread_join(tdic,NULL);
以等待主程序中的线程终止,您将获得确定性行为。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "pthread.h"
#include "semaphore.h"
FILE * f;
sem_t * s1;
sem_t * s2;
int check;
int v1;
int v2;
int i;
static void * client (void *arg){
sem_getvalue(s1, &v1); printf("Client pre wait(S1) in S1 => S1 = %d\n",v1);
sem_wait(s1);
printf("client works...\n");
check = sem_getvalue(s1, &v1); printf("Client.wait(S1) in S1 => S1 = %d\n",v1);
if(check != 0) printf("sem_getvalue error");
return 0;
}
int main(void){
pthread_t tidc;
pthread_t tids;
int rc;
int rs;
//Semaforo 1
s1 = (sem_t *) malloc(sizeof(sem_t));
check = sem_init (s1, 0, 2);
if (check != 0) perror("s1_init failed");
sem_getvalue(s1, &v1);
printf("Create the semaphores: S1 = %i\n",v1 );
sem_wait(s1);
printf("main waits\n");
sem_getvalue(s1, &v1); printf("Main.wait(S1) in S1 => S1 = %d\n",v1);
rc = pthread_create (&tidc, NULL, client, 0);
printf(" thread created ==> rc= %i\n",rc);
return 0;
}
它returns这个输出:
Create the semaphores: S1 = 2
main waits
Main.wait(S1) in S1 => S1 = 1
thread created ==> rc= 0
有时这样:
Create the semaphores: S1 = 2
main waits
Main.wait(S1) in S1 => S1 = 1
thread created ==> rc= 0
Client pre wait(S1) in S1 => S1 = 1
Client pre wait(S1) in S1 => S1 = 1
client works...
Client.wait(S1) in S1 => S1 = Client.wait(S1) in S1 => S1 = 0
似乎有时会创建两个线程,有时不会创建一个。我用 gcc prog.c -lpthred
甚至 gcc -pthread prog.c
如果多线程程序从一次执行到另一次执行不做同样的事情,可能是因为未初始化的变量(如在非线程程序中),但也可能是因为 race condition .
在那种情况下,竞争条件是在线程执行和程序退出之间。
由于您在创建线程后立即退出主线程,因此线程被终止 (main thread exit, does other exit too?)。有时,线程有时间做一些事情,这取决于 OS 状态和负载。
如果您添加一些实际处理、长时间延迟或调用 pthread_join(tdic,NULL);
以等待主程序中的线程终止,您将获得确定性行为。