C 线程在 linux 终端中没有 运行
C Thread doesn't run in linux terminal
我的程序必须严格交替使用 2 个线程递增计数器并使用管道文件同步它们。我知道这没有什么意义,但这是一项大学任务。例如,如果我使用 CodeBlocks 运行 它会出现问题,但是当我从 linux 终端执行程序时它不会打印任何内容,我不知道为什么。任何的想法?
这是我的代码:
#include <stdlib.h>
#include <pthread.h>
#include <wait.h>
#include <unistd.h>
#include <string.h>
int contor;
int fd[2];
void* thread_function(void* arg) {
int* th = (int*)arg;
char x = 'x';
while(1)
{
if (*th == 0 && contor % 2 == 0 && contor < 100) {
close(fd[0]);
write(fd[1], &x, 1);
contor++;
printf("Counter: %d incremented by thread: %ld\n", contor, pthread_self());
sleep(0);
if (contor >= 100)
{
pthread_exit(NULL);
}
} else if (*th == 1 && contor % 2 == 1 && contor < 100){
close(fd[1]);
read(fd[0], &x, 1);
contor++;
printf("Counter: %d incremented by thread: %ld\n", contor, pthread_self());
if (contor >= 100)
{
pthread_exit(NULL);
}
}
if (contor >= 100)
{
pthread_exit(NULL);
}
}
}
void main(int argc, char** argv) {
int tr1 = 0;
int tr2 = 0;
pthread_t t1, t2;
int th0 = 0;
pipe(fd);
tr1 = pthread_create(&t1, NULL, &thread_function, (void*)&th0);
if (tr1) {
printf("Error creating thread #1!");
}
int th1 = 1;
tr2 = pthread_create(&t2, NULL, &thread_function, (void*)&th1);
if (tr2) {
printf("Error creating thread #2!");
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
我编译文件使用: gcc -o ex.exe ex.c -lpthread
我使用以下命令执行可执行文件:./ex.exe
文件描述符由一个进程的所有线程共享。您的一个线程正在关闭管道的一端 (fd[0]
) 并写入管道的另一端 (fd[1]
)。您的另一个线程正在关闭管道的另一端 (fd[1]
) 并读取管道的另一端 (fd[0]
)。此外,它们在 while
循环中多次关闭。
去掉 thread_function
中的 close(fd[0])
和 close(fd[1])
调用会有所帮助。 thread_function
可能还有其他问题,因为我试的时候计数器达到值3
后程序停止输出。
提示:使用两个管道。
我的程序必须严格交替使用 2 个线程递增计数器并使用管道文件同步它们。我知道这没有什么意义,但这是一项大学任务。例如,如果我使用 CodeBlocks 运行 它会出现问题,但是当我从 linux 终端执行程序时它不会打印任何内容,我不知道为什么。任何的想法? 这是我的代码:
#include <stdlib.h>
#include <pthread.h>
#include <wait.h>
#include <unistd.h>
#include <string.h>
int contor;
int fd[2];
void* thread_function(void* arg) {
int* th = (int*)arg;
char x = 'x';
while(1)
{
if (*th == 0 && contor % 2 == 0 && contor < 100) {
close(fd[0]);
write(fd[1], &x, 1);
contor++;
printf("Counter: %d incremented by thread: %ld\n", contor, pthread_self());
sleep(0);
if (contor >= 100)
{
pthread_exit(NULL);
}
} else if (*th == 1 && contor % 2 == 1 && contor < 100){
close(fd[1]);
read(fd[0], &x, 1);
contor++;
printf("Counter: %d incremented by thread: %ld\n", contor, pthread_self());
if (contor >= 100)
{
pthread_exit(NULL);
}
}
if (contor >= 100)
{
pthread_exit(NULL);
}
}
}
void main(int argc, char** argv) {
int tr1 = 0;
int tr2 = 0;
pthread_t t1, t2;
int th0 = 0;
pipe(fd);
tr1 = pthread_create(&t1, NULL, &thread_function, (void*)&th0);
if (tr1) {
printf("Error creating thread #1!");
}
int th1 = 1;
tr2 = pthread_create(&t2, NULL, &thread_function, (void*)&th1);
if (tr2) {
printf("Error creating thread #2!");
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
我编译文件使用: gcc -o ex.exe ex.c -lpthread
我使用以下命令执行可执行文件:./ex.exe
文件描述符由一个进程的所有线程共享。您的一个线程正在关闭管道的一端 (fd[0]
) 并写入管道的另一端 (fd[1]
)。您的另一个线程正在关闭管道的另一端 (fd[1]
) 并读取管道的另一端 (fd[0]
)。此外,它们在 while
循环中多次关闭。
去掉 thread_function
中的 close(fd[0])
和 close(fd[1])
调用会有所帮助。 thread_function
可能还有其他问题,因为我试的时候计数器达到值3
后程序停止输出。
提示:使用两个管道。