Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
Pthread与C语言_C_Pthreads - Fatal编程技术网

Pthread与C语言

Pthread与C语言,c,pthreads,C,Pthreads,这是我的密码: static long x = 0; void * thread_func(void *arg){ while(1){ printf("Thread 2 says %ld\n",++x); sleep(1); } } int main(){ pthread_t tid; pthread_create(&tid,NULL,thread_func,NULL); while(x < 10) { printf("Thread 1 says %ld

这是我的密码:

static long x = 0;
void * thread_func(void *arg){
while(1){
    printf("Thread 2 says %ld\n",++x);
    sleep(1);
}
}
int main(){
pthread_t tid;
pthread_create(&tid,NULL,thread_func,NULL);
while(x < 10)   {
    printf("Thread 1 says %ld\n",++x);
    sleep(2);
}
return 0;
}
现在不应该是第一个线程,因为
pthread\u create()
在main中的while循环之前。 这里的睡眠是如何工作的?
比如线程睡眠到底是为了什么,执行线程睡眠时执行什么进程


i、 睡眠(1)和睡眠(2)1和2代表什么?

我不确定你在读什么书,但你应该立即停止阅读。首先,在
main
中进入循环之前,您不能保证线程将启动并运行。它可以在之前或之后开始。其次,当从两个不同的线程访问变量
x
时,没有访问同步,因此无法保证它将具有什么值。调用
printf
会同步
stdout
对象,调用
sleep
会将线程调出,并且需要花费大量时间来再次调度它。这个例子是无用的,关于输出的假设是错误的

现在,一些答案

现在第一个不应该是线程2说1,因为 pthread_create()位于main中while循环之前

不一定。启动另一个线程需要大量的CPU周期。因此,在另一个线程启动之前,您很可能会在
main
中的
循环中输入
。但是,不一定

这里的睡眠是如何工作的

它告诉内核在给定的秒数内不要执行调用线程。由于与调度相关的开销,实际睡眠时间可能会稍长一些。其他线程不受此影响(当然,它们受此影响,但不直接受此影响,即其他线程可能有更多的CPU时间等)


执行线程休眠时执行哪个进程


进程从不执行任何操作。执行进程(和线程)的是内核的调度。默认情况下,进程由一个主线程组成,内核执行它。当您创建更多线程时,调度程序将在进程内执行更多线程等。当一个或多个线程处于睡眠状态时,调度程序将执行那些未处于睡眠状态的线程。把线程想象成共享同一地址空间的进程——这就是它们。

我不确定你在读什么书,但你应该立即停止阅读。首先,在
main
中进入循环之前,您不能保证线程将启动并运行。它可以在之前或之后开始。其次,当从两个不同的线程访问变量
x
时,没有访问同步,因此无法保证它将具有什么值。调用
printf
会同步
stdout
对象,调用
sleep
会将线程调出,并且需要花费大量时间来再次调度它。这个例子是无用的,关于输出的假设是错误的

现在,一些答案

现在第一个不应该是线程2说1,因为 pthread_create()位于main中while循环之前

不一定。启动另一个线程需要大量的CPU周期。因此,在另一个线程启动之前,您很可能会在
main
中的
循环中输入
。但是,不一定

这里的睡眠是如何工作的

它告诉内核在给定的秒数内不要执行调用线程。由于与调度相关的开销,实际睡眠时间可能会稍长一些。其他线程不受此影响(当然,它们受此影响,但不直接受此影响,即其他线程可能有更多的CPU时间等)


执行线程休眠时执行哪个进程


进程从不执行任何操作。执行进程(和线程)的是内核的调度。默认情况下,进程由一个主线程组成,内核执行它。当您创建更多线程时,调度程序将在进程内执行更多线程等。当一个或多个线程处于睡眠状态时,调度程序将执行那些未处于睡眠状态的线程。把线程想象成共享同一地址空间的进程——这就是它们。

这个程序有一个巨大的缺陷,这是任何多线程程序都无法承受的。实际上,我允许一个全局变量“x”被两个线程操纵,而不需要它们之间的任何同步。这肯定会导致变量中包含的数据变得不一致。将导致不可预测的输出。你需要参考一本有好例子的好书。基本上,这个想法是在访问变量“x”时使用锁

正如上面其他人所指出的,睡眠将阻止内核在所需的秒数内执行线程。我觉得它在这里被用作同步的手段。然而,睡眠从来都不是一个好的选择,因为它不能保证变量“x”上的操作不会变得不一致。不要依赖睡眠。使用锁。一个开始线程编程的好地方是


它是pthread的入门

该程序有一个巨大的缺陷,这是任何多线程程序都无法承受的。实际上,我允许一个全局变量“x”被两个线程操纵,而不需要它们之间的任何同步。这肯定会导致变量中包含的数据变得不一致。将导致不可预测的输出。你需要参考一本有好例子的好书。基本上,这个想法是在访问变量“x”时使用锁

正如上面其他人所指出的,睡眠将阻止内核在所需的秒数内执行线程。我觉得它在这里被用作同步的手段。然而,睡眠从来都不是一个好的选择,因为它不能保证变量“x”上的操作不会变得不一致。不要依赖睡眠。使用锁。一个开始线程编程的好地方是

它是pthread的入门

Sleep(1)
并不意味着:嘿,请给我1号线
OUTPUT
Thread 1 says 1
Thread 2 says 2
Thread 2 says 3
Thread 1 says 4
Thread 2 says 5
Thread 2 says 6
Thread 1 says 7
Thread 2 says 8
Thread 2 says 9
Thread 1 says 10
Thread 2 says 11
Thread 2 says 12